关于vector的一个问题

mengxiang2003 2008-03-13 02:03:58
我定义了一个结构体
typedef struct
{
char desc[50];
char *p;
..

}Element;

这是全局变量
vector<Element> list;

然后在一个函数中
void fun(vector<Element> &list)
{
CN_Element myElement;
myElement.p = (char*)malloc(10);
list.push_back(myElement)

}
CN_Element myElement是在fun函数中定义的,当fun函数结束后应该自动销毁了,那么list里面的Element还有效吗?
如果还是有效的,那么程序结束时应该如何释放内存?因为p指向的内存是在堆上申请的,用list.clear()应该不能释放掉吧
...全文
299 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
hslinux 2008-03-18
  • 打赏
  • 举报
回复
自己分配的空间自己释放,除非你使用auto_ptr.
paidfighting 2008-03-18
  • 打赏
  • 举报
回复
有效但记得要遍历删除拥有的内存。。
v41dugu 2008-03-18
  • 打赏
  • 举报
回复
最好用my_list
xbt746 2008-03-14
  • 打赏
  • 举报
回复
有效
vector是值拷贝,你存的是结构体,不是指针
wpalhm 2008-03-14
  • 打赏
  • 举报
回复
有效!

对于STL的工作方式是:进去的是拷贝,出来的也是拷贝。所以动态分配的内存是有效的!

然而Element必须定义拷贝构造函数,同时最好把赋值函数也实现了,你还得在析构函数里手动去释放堆上的空间(可以用boost库中的智能指针)!


星羽 2008-03-13
  • 打赏
  • 举报
回复
不要用list这种名字,因为stl也有个list
星羽 2008-03-13
  • 打赏
  • 举报
回复

不要用list这种名字,因为stl就有个list
baihacker 2008-03-13
  • 打赏
  • 举报
回复
如果用遍历的话,就不大安全了.
但是,既然是显示地分配,就最好显示地回收,所以用遍历比较好(和fun对应)
注意到
myElement.p = (char*)malloc(10);
所以最好用一个模板传入size信息
template < int size = 10>
struct
{
char desc[50];
char p[size];
};

这样就免去了动态申请内存,和内存回收的麻烦...
当然了
struct
{
int size
char desc[50];
char* p;
};
在构造函数内分配,在析构函数里回收也行

至于用什么还是看你的需求...
mengxiang2003 2008-03-13
  • 打赏
  • 举报
回复
ok,我明白了,谢谢各位~!
Supper_Jerry 2008-03-13
  • 打赏
  • 举报
回复
list.push_back(myElement)
这个调用的是拷贝构造函数
所以应当给结构体定义拷贝构造函数
析构的时候需要遍历整个vector,手工对堆上申请的内存释放
zhangyue02135 2008-03-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 dizuo 的回复:]
有效的,因为你通过malloc申请的地址已经被拷贝到了vector里面,
通过vector是可以访问的,不会有内存泄漏的问题.
[/Quote]
在fun()中对myElement.desc[]这部分的内容是怎么拷贝到list中去的?struct的默认拷贝是bit-wise的吗?
dubiousway 2008-03-13
  • 打赏
  • 举报
回复

用list.clear()应该不能 p指向的内存;但list.clear()会释放指针变量 p,p 一旦丢失,p 指向的内容无法访问,如果没有提前有释放,则内存泄漏。觉得应该是这样的。应该按2楼程序顺序 clear 前先释放
ryfdizuo 2008-03-13
  • 打赏
  • 举报
回复
#include <iostream>
#include <vector>
#include <string>
using namespace std;

struct Element
{
char desc[50];
char *p;
};

vector<Element>list;
void fun(vector <Element> &list)
{
Element myElement;
myElement.p= (char*)malloc(10);
int i;
for (i=0; i<9; i++)
{
myElement.p[i]='A'+i;
}
myElement.p[i]='\0';
list.push_back(myElement);
}
int main()
{
fun(list);
for(int i=0; i<list.size(); i++)
{
cout<<list.at(i).p<<endl;
free( list.at(i).p );// 结构体,显示的释放也可以,类的话,就在析构函数里面。
}
list.clear();

return 0;
}
ysuliu 2008-03-13
  • 打赏
  • 举报
回复
Vector里的东西已经拷贝了,里面不是指向堆内存的指针,所以里面的东西还是有效的。
按照你现在的定义方式,只有在程序结束的时候,list才会销毁。
hastings 2008-03-13
  • 打赏
  • 举报
回复
你可以从vector<Element>派生出一个子类,
并重载析构函数,并在析构函数中释放内存.
  • 打赏
  • 举报
回复
给结构体增加析构函数,删除自己拥有的内存。
cad_vc 2008-03-13
  • 打赏
  • 举报
回复
vector <Element*> list;

void fun(vector <Element> &list)
{
CN_Element* pmyElement = new CN_Element;
myElement->p = (char*)malloc(10);
list.push_back(pmyElement)
}

//释放
void clear()
{
for(int i=0; i<list.size(); i++)
{
CN_Element* pele = list.at(i);
if (pele)
{
free(pele->p)
delete pele;
}
}

list.clear()
}
ryfdizuo 2008-03-13
  • 打赏
  • 举报
回复
有效的,因为你通过malloc申请的地址已经被拷贝到了vector里面,
通过vector是可以访问的,不会有内存泄漏的问题.

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧