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

zhaoyunfullmetal 2013-04-22 11:09:04
在vector中,如果元素是对象的指针,当该vector用erase删除元素时,那么元素本身在该vector种会被删除,但对象本身是否会被删除呢?本来以为是被删除的,但是突然发现貌似对象本身没有被实际删除....

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

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

void removeParent(Groups* node)
{
for (ParentList::const_iterator itr = _parents.begin(); itr!=_parents.end();++itr)
{
if( *itr._Ptr == node && itr!=_parents.end())
{
_parents.erase(itr);
break;
}
}
}//其中 typedef std::vector<Groups*> ParentList;

调用了之后geodo2也调用同样的方法,也可以通过不报错误,那岂不是erase方法并没有将真正的对象销毁? 求各路大神解释啊!!!
...全文
2639 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
lwmonster 2014-05-21
  • 打赏
  • 举报
回复
引用 12 楼 ri_aje 的回复:
[quote=引用 9 楼 zhaoyunfullmetal 的回复:] 引用 2 楼 ri_aje 的回复:不会,得自己动手。其实直接 vector<Groups> 更简单,这个就会帮你删除了。 用vector<Groups>感觉不对劲啊,一般管理对象更习惯用指针些啊 用智能指针可行的原理 是因为erase会调用智能指针的析构函数从而调用对象的析构函数嘛??
你不妨说说 vector<Groups> 到底那里不对劲,有时候只不过是习惯而已,自己把自己禁锢了。[/quote] 亲测:

class A {
public:
  virtual void fun(){
    cout << "in A" << endl;
  }
};
class B : public A {
public:
  string name;
};
class C : public B {
public :
  virtual void fun(){
    cout << "in C" << endl;
  }
};
int main(){
  vector<A> vec;
  vec.push_back(C());
  vec[0].fun();
  /**  这段代码才有用
  vector<A*> vec;
  vec.push_back(new C());
  vec[0]->fun();
  **/
}
上面代码显示存对象和存指针是不同的。
pathuang68 2013-04-23
  • 打赏
  • 举报
回复
不会。最佳实践是:除非十分必要,否则一般在容器中存放对象,而不是对象指针。如果存放的是对象指针,那么程序员自己要负责销毁对象。
zhcosin 2013-04-23
  • 打赏
  • 举报
回复
要么自己删除,要么使用智能指针
lm_whales 2013-04-23
  • 打赏
  • 举报
回复
除了个别例外,自己new的要自己delete; 不然会出错的。
ri_aje 2013-04-22
  • 打赏
  • 举报
回复
是的,不会,而且一直以来就是这样。要是非得在容器中存储指针,还需要自动销毁,就只能存储智能指针了。
zhaoyunfullmetal 2013-04-22
  • 打赏
  • 举报
回复
引用 1 楼 starytx 的回复:
肯定不会,需要在erase之前先释放指针元素指向的空间
完了完了 长时间不写C++,现在完全毁三观了 意思就是erase不会调用指针对应对象的析构函数啦?
飞天御剑流 2013-04-22
  • 打赏
  • 举报
回复
方法太多了。 可以把指针改为句柄类,或者直接用个类简单封装,在析构函数里delete就行了。 不想改的话,还可以对stl::vector进行扩展,从vector继承,然后在析构函数里delete。 还可以再加入一个针对Group*的特化,同样在析构函数里delete。
jfcat 2013-04-22
  • 打赏
  • 举报
回复
vector就是一个容器,对容器内数据的操作要看容器内元素的类型,如果是原始类型就直接释放了,对于类需要调用析构函数。指针也是一种变量,当然就直接释放了,不会改变指针所指向的对象的
ri_aje 2013-04-22
  • 打赏
  • 举报
回复
不会,得自己动手。其实直接 vector<Groups> 更简单,这个就会帮你删除了。
starytx 2013-04-22
  • 打赏
  • 举报
回复
肯定不会,需要在erase之前先释放指针元素指向的空间
ri_aje 2013-04-22
  • 打赏
  • 举报
回复
引用 9 楼 zhaoyunfullmetal 的回复:
引用 2 楼 ri_aje 的回复:不会,得自己动手。其实直接 vector<Groups> 更简单,这个就会帮你删除了。 用vector<Groups>感觉不对劲啊,一般管理对象更习惯用指针些啊 用智能指针可行的原理 是因为erase会调用智能指针的析构函数从而调用对象的析构函数嘛??
你不妨说说 vector<Groups> 到底那里不对劲,有时候只不过是习惯而已,自己把自己禁锢了。
zhaoyunfullmetal 2013-04-22
  • 打赏
  • 举报
回复
引用 7 楼 zhao4zhong1 的回复:
对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步对应汇编一行! 单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代……
谢大神!!
zhaoyunfullmetal 2013-04-22
  • 打赏
  • 举报
回复
引用 3 楼 supermegaboy 的回复:
方法太多了。 可以把指针改为句柄类,或者直接用个类简单封装,在析构函数里delete就行了。 不想改的话,还可以对stl::vector进行扩展,从vector继承,然后在析构函数里delete。 还可以再加入一个针对Group*的特化,同样在析构函数里delete。
本人比较菜 还需要多多学习
zhaoyunfullmetal 2013-04-22
  • 打赏
  • 举报
回复
引用 2 楼 ri_aje 的回复:
不会,得自己动手。其实直接 vector<Groups> 更简单,这个就会帮你删除了。
用vector<Groups>感觉不对劲啊,一般管理对象更习惯用指针些啊 用智能指针可行的原理 是因为erase会调用智能指针的析构函数从而调用对象的析构函数嘛??
Defonds 2013-04-22
  • 打赏
  • 举报
回复
不会哦,java 里可以
赵4老师 2013-04-22
  • 打赏
  • 举报
回复
对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步对应汇编一行! 单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。 VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
neofung 2013-04-22
  • 打赏
  • 举报
回复
可以使用shared_ptr

65,201

社区成员

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

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