被push_back进vector的结构体指针合适可以被delete???

shizn2001 2011-03-24 12:45:45
简单的代码如下。。。
typedef struct data
{
int a;
int b;
}MYDATA;

vector<MYDATA*> v_data;
int x,y;

for(i=0;i<100;i++)
{
MYDATA* pdata=new MYDATA;
pdata->a=i;
pdata->b=i+10;
v_data.push_back(pdata);
//delete pdata; <----------------------问题就出在这里
}

for(i=0;i<v_data.size();i++)
{
x=v_data[i]->a;
y=v_data[i]->b;
}

问题就出在delete那里,如果保留delete pdata,那么下面的x,y将无法被赋值。
如果注释掉delete,那么会不会造成内存泄漏?实际应用中,可能要push_back上万次。。。)

目前的想法是当v_data.size()达到某一设定值时,pop_back全部元素,并delete掉,请问这种思路是否可行?是否还留有隐患?




...全文
937 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
steven30832 2012-12-29
  • 打赏
  • 举报
回复
引用 17 楼 shizn2001 的回复:
引用 5 楼 liwang112358 的回复:v_data.push_back(pdata); 这句只是把指针pdata拷贝到 vector当中的一个指针p1当中 注意是拷贝 也就是说当前pdata和p1指向同一个东西,p1在vector中。 并不是将结构体放入vector,这点需要明确。 这时如果你delete pdata 也就是释放了 pdata 所指向……
这个地方,当你用push_back的时候,你的vector中增加的只是一个指针,而不是对象!此时,vector的最后一个项,是一个指针p,p指向的是和pdata相同的空间。如果你使用了delete pdata,那么pdata指向的空间就被释放了,那么p指向的就变成了被释放的空间。p就成为了了一个悬挂指针,他指向空间的值就不确定了。 new分配的空间在堆中,需要手动delete。
shizn2001 2011-03-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 liwang112358 的回复:]
v_data.push_back(pdata);
这句只是把指针pdata拷贝到 vector当中的一个指针p1当中 注意是拷贝
也就是说当前pdata和p1指向同一个东西,p1在vector中。
并不是将结构体放入vector,这点需要明确。

这时如果你delete pdata 也就是释放了 pdata 所指向的内存,即p1所指向的内存,
导致的结果是p1依然在vector中,但是已经成为野指针,当你再次访问的时候就会报错。[/Quote]
嗯,我就是这个意思。。。
把结构体指针存入vector,据说这样效率比较高。。。。。。其实是不是真的高我也搞不清楚。。。这个事再说吧。

那么接下来一个问题,如果delete pdata的话,那么pdata指向的内存中的数据应该仍然存在吧,p1为啥就野了呢?p1的类型应该是已知的,p1此时是否有值?p1指向的内存中是否还有数据?

如果我增加了1楼的代码,那么应该同等于是delete p1(p1来自vector,由pdata拷贝而来),这样理解是否正确?

俺程序工作过程大致如下:
通过一个while不断从下位机读取数据,解析后更新某一结构体变量。每更新一次,new一个指针,赋值,存入vector,再更新。。。
LiWang112358 2011-03-25
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 shizn2001 的回复:]

那么接下来一个问题,如果delete pdata的话,那么pdata指向的内存中的数据应该仍然存在吧,p1为啥就野了呢?
[/Quote]

delete pdata 是将pdata所指向的内存释放,这时候这段内存的数据你就已经不能操作了,p1这是也指向这个位置,但是这个位置已经不能操作了,所以p1是野指针。
zicheng_lin 2011-03-25
  • 打赏
  • 举报
回复
感觉一楼的方法可行,不知道还有没有更好的方法了,等待中。。。。
碎碎念 2011-03-25
  • 打赏
  • 举报
回复
v_data.push_back(pdata);
//delete pdata; <----------------------问题就出在这里
push完直接delete肯定不对....
v_data在不用的时候,利用for循环整体delete就行了..
pathuang68 2011-03-24
  • 打赏
  • 举报
回复
4L的回答,其实是非常好的。
rainID 2011-03-24
  • 打赏
  • 举报
回复
堆上分配的空间本来就是自己去释放。

vector有析构函数,会自己析构的
xiaobaihongye404 2011-03-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 liwang112358 的回复:]
根据本人的经验:

v_data.push_back(pdata);
这句只是把指针pdata拷贝到 vector当中的一个指针p1当中 注意是拷贝
也就是说当前pdata和p1指向同一个东西,p1在vector中。
并不是将结构体放入vector,这点需要明确。

这时如果你delete pdata 也就是释放了 pdata 所指向的内存,即p1所指向的内存,
导致的结果是p1依……
[/Quote]这个解释我喜欢
herman~~ 2011-03-24
  • 打赏
  • 举报
回复
lz的情况必须被delete,如果不想手动delete需要使用 智能指针
傻二愣 2011-03-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 liwang112358 的回复:]
根据本人的经验:

v_data.push_back(pdata);
这句只是把指针pdata拷贝到 vector当中的一个指针p1当中 注意是拷贝
也就是说当前pdata和p1指向同一个东西,p1在vector中。
并不是将结构体放入vector,这点需要明确。

这时如果你delete pdata 也就是释放了 pdata 所指向的内存,即p1所指向的内存,
导致的结果是p1依……
[/Quote]
这是正解····可以先去看下delete的作用···
direction917 2011-03-24
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 liwang112358 的回复:]

根据本人的经验:

v_data.push_back(pdata);
这句只是把指针pdata拷贝到 vector当中的一个指针p1当中 注意是拷贝
也就是说当前pdata和p1指向同一个东西,p1在vector中。
并不是将结构体放入vector,这点需要明确。

这时如果你delete pdata 也就是释放了 pdata 所指向的内存,即p1所指向的内存,
导致的结果是p1……
[/Quote]
对结构体不太熟,不过顶这种说法
ljt3969636 2011-03-24
  • 打赏
  • 举报
回复
容器里拷贝的是指针的副本,你把其指向的东西删了,他就悬空了。

[Quote=引用 3 楼 fengzhw 的回复:]

初学C++,不太懂,有个邪恶的想法:把智能指针用到vector当中如何?
[/Quote]

是很邪恶,得看你怎么定义智能指针了,但是标准的auto_ptr这是被禁止的,标准的auto_ptr的赋值操作会破坏原对象(详见其实现),这样会使容器空空如也。这种行为叫做COAP已经被一些编译器禁止了。
wbruce 2011-03-24
  • 打赏
  • 举报
回复
按1楼的说法,当vector不用的时候销毁全部的元素,这样不好吗?
CppCoder 2011-03-24
  • 打赏
  • 举报
回复
vector中存放指针,需要自己编码释放内存,可以在数据用完后遍历vector,delete每个指针
不想自己管理内存,vector直接存值好了
pathuang68 2011-03-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 pengzhixi 的回复:]

当你的v_data不用了,然后你用一个for循环
for(int i=0;i!=v_data.size();++i)
{
delete v_data[i];
}
释放下就是了
[/Quote]

+
这就答案
vans322 2011-03-24
  • 打赏
  • 举报
回复
同意四楼
LiWang112358 2011-03-24
  • 打赏
  • 举报
回复
根据本人的经验:

v_data.push_back(pdata);
这句只是把指针pdata拷贝到 vector当中的一个指针p1当中 注意是拷贝
也就是说当前pdata和p1指向同一个东西,p1在vector中。
并不是将结构体放入vector,这点需要明确。

这时如果你delete pdata 也就是释放了 pdata 所指向的内存,即p1所指向的内存,
导致的结果是p1依然在vector中,但是已经成为野指针,当你再次访问的时候就会报错。
昵称很不好取 2011-03-24
  • 打赏
  • 举报
回复
auto_ptr不能用于容器,shared_ptr之类的可以,可以看看boost方面的内容
fengzhw 2011-03-24
  • 打赏
  • 举报
回复
初学C++,不太懂,有个邪恶的想法:把智能指针用到vector当中如何?
lhwiskoala 2011-03-24
  • 打赏
  • 举报
回复
上万次也不多呀。
如果你的程序不是一个月不关的话,基本也没啥问题。
当程序结束时会进程的所有内存都会收回的。

如果真要做,楼上办法可以。
不过我不明白为什么要new呢?
加载更多回复(1)

65,210

社区成员

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

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