用erase删掉一个元素,为何没调用相应的destructor?

gimmytang2003 2003-10-22 01:43:56
先定义一个类myclass:
class myclass{
public:
myclass();
~myclass();
dosomething();
}
主函数如下:其中myvector是装有该类指针的容器。
int main()
{
vector<myclass *> myvector;
myclass* newPtr;
newPtr = new myclass;
myvector.push_back(newPtr); // 往容器中增加一个类指针
myvector.erase( myvector.begin() );// 删掉这个类指针
int j = myvector.size();// 运行后显示为0,说明该容器为空
myvector[0]->dosomething();//可是这句仍可运行,证明myvector中
//还有指针存在,并没被删掉,怎么回事?
return 0;
}
...全文
64 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
北极猩猩 2003-10-22
  • 打赏
  • 举报
回复
应该直接将对象加入vector中,否则是不会调用destructor的(不仅使destructor,连内存都不会释放的)
你加入的是指针,只好自己负责释放了,delete
boxban 2003-10-22
  • 打赏
  • 举报
回复
myclass是动态申请的,不通过delete调用,就不会从内存中删除掉,也不会调用析构函数。
如lonelyplanet(大地任我行) 所说,你erase掉的仅仅是指针,而不是实际的对象。

lonelyplanet(大地任我行)的比喻虽然很形象:除非你拆掉王府井(调用delete),王府井不会因为路牌被烧掉而消失。
south2000 2003-10-22
  • 打赏
  • 举报
回复
楼上说的经典,让小弟也获益非浅。你可以可以试试
myclass A;
myvector.push_back(A);
myvector.erase( myvector.begin() );
int j = myvector.size();
myvector[0].dosomething();//看看此句是否还执行
lonelyplanet 2003-10-22
  • 打赏
  • 举报
回复
myvector.erase( myvector.begin() );// 删掉这个类指针
正如你在注释中写的那样删的是指针而非对象,而且只是vector中的那个指针。

就象你把写有"前方100米是王府井"的路牌烧了,但王府井依然在那里一样。
ThisYang 2003-10-22
  • 打赏
  • 举报
回复
这个问题的出现主要是当vector 剔除掉一个元素时,并没有重新让vector 分配内存,
而只是变动size而已,
因为当vector 声明一个实体的时候,vector 会分配一个比较合适的内存空间,具体算法的分配是按照8的整数倍来分配的。
只有当分配的内存空间不够时,vector 才会重新分配内存,所以用vector的时候最好事先知道自己要用多少memory这样才不至于vector 反复进行内存分配。如果不知道的话,可以采用list,dlist之类的容器。
所以上面的这个问题,当你用erase剔除一个指针的时候,并没有真正的删除,而是把vector的size - 1,即你用vector[0]还是可以访问到该指针。同样不用指针也存在同样的问题。
gimmytang2003 2003-10-22
  • 打赏
  • 举报
回复
int main()
{
vector<myclass *> myvector;
myclass* newPtr;
newPtr = new myclass;
myvector.push_back(newPtr);
myvector.erase( myvector.begin() );
int j = myvector.size();
delete newPtr; //增加这一句,彻底删除对象。
myvector[0]->dosomething();
return 0;
}
jianshen77 2003-10-22
  • 打赏
  • 举报
回复
erase去掉的是对象指针,对象没有消除。
还有可能的一点是;
在vector里面保持对象指针的数组指针所指的地址还没有重新分配。
myvector[0]返回了原来的对象地址。
所以就出现以上的情况了。

24,855

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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