我new出来都东西,放到相应都list中,然后delete都话,会影响这个list吗?

lingling1989r 2009-01-28 10:59:54
例如:
class A{};
list<A> alist;
A *ap;
ap=new A;
....
alist.push_back(ap);
delete []ap;
再重复上面都操作,那我放到这个list中都东西,会因为我delete掉而没有吗?
多讲点更好。谢谢~
...全文
299 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
lingling1989r 2009-02-07
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 huayehanshan 的回复:]
引用 20 楼 lann64 的回复:
直接定义list <A> alist, 然后用一个局部变量 A a,对a赋值后 push_back进alist就行了,这个局部变量又可以用作下一次赋值。
最后局部变量自动析构和释放,list的节点也自动由list析构和释放就行了。


正解,楼主还是这样做。使程序的条理更加清晰。
[/Quote]
之所以不那么用,是因为list里放的是个类的指针,而我还要用这个指针去new它的派生类型,所以。。。
herman~~ 2009-02-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xiaoyisnail 的回复:]
首先,你写的代码错了
按照你的意思,应该是list <A*>而不是list <A>,应该是delete ap而不是delete [] ap

delete了,就释放了,alist里的指针就都是野指针了
[/Quote]

同意
叶落寒山 2009-02-02
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 lann64 的回复:]
直接定义list <A> alist, 然后用一个局部变量 A a,对a赋值后 push_back进alist就行了,这个局部变量又可以用作下一次赋值。
最后局部变量自动析构和释放,list的节点也自动由list析构和释放就行了。
[/Quote]

正解,楼主还是这样做。使程序的条理更加清晰。
长安宁 2009-02-02
  • 打赏
  • 举报
回复
如果 delete 掉了,那么list里面的指针,指向的内存,就不是本程序,所能保护使用的了,情况不好的情况下,会让其他的程序占用,你再读写,会使本程序crash掉
我看你有戏 2009-02-02
  • 打赏
  • 举报
回复


一般情况下list里保存的是指针

list就是为了更好的管理,访问内存而设计的

指针拿到了,想干啥就干啥了
信念 2009-02-02
  • 打赏
  • 举报
回复
没看到解决问题的
lann64 2009-02-01
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 lingling1989r 的回复:]
回复15楼:

是这样的

C/C++ code
A *ap;
ap=new A;
...//对ap的一些赋值
alist.push_back(ap);//将new出来的A类对象放到这个链里
ap=new A;
...//又对ap的另一些赋值
alist.push_back(ap);//将重新new出来的再存到这个list里
...
...//我不敢在这里delete []ap,因为这个alist是我另一个类的成员数据,而这些代码是我那个类的一个用来给alist赋值的成员函数,所以我最后就在析构函数里写回收代码了




追…
[/Quote]
没看懂在说什么。
这里关键是alist怎么定义的,要是list <A> alist 就只能是alist.push_back(*ap),要是list<A*> alist 那当然不能在还要使用alist的情况下delete了。

其实,感觉这里没必要用new。
直接定义list<A> alist, 然后用一个局部变量 A a,对a赋值后 push_back进alist就行了,这个局部变量又可以用作下一次赋值。
最后局部变量自动析构和释放,list的节点也自动由list析构和释放就行了。
matrixdwy 2009-01-30
  • 打赏
  • 举报
回复
YES.list中的指针统统变成孤魂野鬼
matrixdwy 2009-01-30
  • 打赏
  • 举报
回复
YES.list中的指针统统变成孤魂野鬼
lingling1989r 2009-01-30
  • 打赏
  • 举报
回复
回复15楼:

是这样的

A *ap;
ap=new A;
...//对ap的一些赋值
alist.push_back(ap);//将new出来的A类对象放到这个链里
ap=new A;
...//又对ap的另一些赋值
alist.push_back(ap);//将重新new出来的再存到这个list里
...
...//我不敢在这里delete []ap,因为这个alist是我另一个类的成员数据,而这些代码是我那个类的一个用来给alist赋值的成员函数,所以我最后就在析构函数里写回收代码了


追问一句:我上面的想法对吗?还有什么办法么??
lingling1989r 2009-01-29
  • 打赏
  • 举报
回复
恩,我好好学习。
大家都不用睡觉都么?难得过年寒假的,大家注意休息哦。
lingling1989r 2009-01-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xiaoyisnail 的回复:]
引用 6 楼 lingling1989r 的回复:
恩,我很白痴。那如果我要回收这些垃圾,要怎么做才比较好呢?
我就在不用那个指针去delete了,就等我用完这个list后,再list.clear()就可以了吧。


是的,用完后delete list里的指针,最后list.clear(当然,这最后一步不是必须的)
[/Quote]

我想问下,为什么list.clear()不是必须的,是因为它自己会回收的原因么?
那我要是不delete 那个指针行么?就一直new,new完就push_back到list中,我用List去回收。

太晚了,再等5分钟,我要先去睡觉了。
yutaooo 2009-01-29
  • 打赏
  • 举报
回复

哦,囧rz

普通的做法就是,在list.clear 前 ........
du51 2009-01-29
  • 打赏
  • 举报
回复
试下
boost::shared_ptr
yutaooo 2009-01-29
  • 打赏
  • 举报
回复

好的做法是使用智能指针。比如采用 boost 的 shared_ptr。 shared_ptr 马上成为标准库的一部分了。

普通的做法就是,在list.clear,对list里的元素,逐个的使用 delete 。一个 for 循环,遍历一遍。就好了呀。
lingling1989r 2009-01-29
  • 打赏
  • 举报
回复
大家教训都太对了!开始那个list<A*>是笔误,后来那个delete []ap,因为我想着自己还要再用这个a指针去new很多A类,所以就用了delete []ap,我还想问下,
我这么理解是不是也是个错误啊?
我以为,delete []ap,就会把只要是ap指针new出来都东西一起消了。
那如果没错都话,谁能给我解释一下吗?我不明白它new出来都东西,用delete[]ap是怎样知道哪些是由ap指针new出来的呢?他们是怎么存储的呢?ap都指向是什么?

不好意思一下问这么多。
xiaoyisnail 2009-01-29
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lingling1989r 的回复:]
恩,我很白痴。那如果我要回收这些垃圾,要怎么做才比较好呢?
我就在不用那个指针去delete了,就等我用完这个list后,再list.clear()就可以了吧。
[/Quote]

是的,用完后delete list里的指针,最后list.clear(当然,这最后一步不是必须的)
lingling1989r 2009-01-29
  • 打赏
  • 举报
回复
恩,我很白痴。那如果我要回收这些垃圾,要怎么做才比较好呢?
我就在不用那个指针去delete了,就等我用完这个list后,再list.clear()就可以了吧。
lann64 2009-01-29
  • 打赏
  • 举报
回复
这样也行。
class A{};
list <A> alist;
A *ap;
ap=new A;
....
alist.push_back(*ap);
delete ap;
asmcer 2009-01-29
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 lingling1989r 的回复:]
我想问下,为什么list.clear()不是必须的,是因为它自己会回收的原因么?
那我要是不delete 那个指针行么?就一直…
[/Quote]

list.clear() 只是清除了你存在list里面的了指针(从内存角度上来说,就是一些代表内存地址的数值),却没有清除这些指针所指向的内存空间,如果没有其它指针指向这块空间,那么这块内存空间就会变成垃圾空间,无法访问,却占着内存不放,造成了内存的“泄漏”。

这样打个比方: 把 list 看作一个放钥匙的钥匙串,你把你家里各个房间的钥匙都挂在这个钥匙串上,有一天你搬家了,你直接把钥匙连钥匙串一起扔掉了,那么,如果你没有配过钥匙的话,就没人能进那些房间了,虽然你身上时轻松了很多(因为把一大串钥匙都仍掉了),但是却造成了房间的浪费。长此下去,可以想象,...
加载更多回复(6)

64,646

社区成员

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

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