首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

vector中,元素是对象的指针,调用erase剔除元素时,是否会把对象本身销毁

2013-04-26 
vector中,元素是对象的指针,调用erase删除元素时,是否会把对象本身销毁?在vector中,如果元素是对象的指针,

vector中,元素是对象的指针,调用erase删除元素时,是否会把对象本身销毁?
在vector中,如果元素是对象的指针,当该vector用erase删除元素时,那么元素本身在该vector种会被删除,但对象本身是否会被删除呢?本来以为是被删除的,但是突然发现貌似对象本身没有被实际删除....

Groups *group1 = new Groups();
Geode *geodo1 = new Geode();
Geode *geodo2 = new Geode();
geodo1,geodo2 都将group1 添加为自己的父节点

两个Geode对象中都有一个Vector<Groups*>包含了其所有父节点的指针,其中一个geodo1 调用removeParent方法:


vector, erase
[解决办法]
肯定不会,需要在erase之前先释放指针元素指向的空间
[解决办法]
不会,得自己动手。其实直接 vector<Groups> 更简单,这个就会帮你删除了。
[解决办法]
方法太多了。

可以把指针改为句柄类,或者直接用个类简单封装,在析构函数里delete就行了。

不想改的话,还可以对stl::vector进行扩展,从vector继承,然后在析构函数里delete。

还可以再加入一个针对Group*的特化,同样在析构函数里delete。
[解决办法]
是的,不会,而且一直以来就是这样。要是非得在容器中存储指针,还需要自动销毁,就只能存储智能指针了。
[解决办法]
可以使用shared_ptr
[解决办法]
对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!

单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。

VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。

[解决办法]
不会哦,java 里可以
[解决办法]
引用:
引用:不会,得自己动手。其实直接 vector<Groups> 更简单,这个就会帮你删除了。
用vector<Groups>感觉不对劲啊,一般管理对象更习惯用指针些啊
用智能指针可行的原理 是因为erase会调用智能指针的析构函数从而调用对象的析构函数嘛??

你不妨说说 vector<Groups> 到底那里不对劲,有时候只不过是习惯而已,自己把自己禁锢了。
[解决办法]
vector就是一个容器,对容器内数据的操作要看容器内元素的类型,如果是原始类型就直接释放了,对于类需要调用析构函数。指针也是一种变量,当然就直接释放了,不会改变指针所指向的对象的
[解决办法]
除了个别例外,自己new的要自己delete;
不然会出错的。
[解决办法]
要么自己删除,要么使用智能指针
[解决办法]
不会。最佳实践是:除非十分必要,否则一般在容器中存放对象,而不是对象指针。如果存放的是对象指针,那么程序员自己要负责销毁对象。

热点排行