vector对象调用clean()函数时,其包含的元素指向的对象是否能自动析构

liyaobinRyan 2010-10-26 11:43:09
我定义了一个Base类,然后定义了一个vector对象来存放指向Base类的对象指针,即vector<Base*>。然后我用new创建了几个Base对象,当把这几个对象的指针放到vector中。些时我调用vector对象的clean()函数时,会否调用Base对象的析构函数,对 我刚才用new生成的Base对象进行析构。还是要我自己用Vector中Base指针逐一调用delete进行手动析构。

class Base
{
......
};

vector<Base*> baseList;
Base base1* = new Base();
Base base2* = new Base();
Base base3* = new Base();
baseList.push_back(base1);
baseList.push_back(base2);
baseList.push_back(base3);

//些时我调用clean函数时能否自己把我刚才NEW的几个对象自动析构呢?
baseList.clean();

//如果不能自动析构,我是否自行对baseList中的每个对象调用一个delete呢?
...全文
262 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
lsupper 2010-10-26
  • 打赏
  • 举报
回复
应该说,只是把指针从vector里面移除了...没析构...
冻结 2010-10-26
  • 打赏
  • 举报
回复
只是删除了指针,并没有析构
luciferisnotsatan 2010-10-26
  • 打赏
  • 举报
回复
只是删除了指针,并没有析构
lixianmin 2010-10-26
  • 打赏
  • 举报
回复
需要你手动调用delete,你在析构函数里写一个std::cout验证一下就知道了

另外,纠正一下,那个函数叫clear(),不叫clean

不过, 其实你可以这样做,定义一个functor如下:

struct deleter { template < typename T> operator()(T*& p) { delete p; p= NULL; }};

然后,针对你的baseList调用 std::for_each(baseList.begin(), baseList.end(), deleter()); 就可以释放了
Aniao 2010-10-26
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 chain2012 的回复:]

没有,如果要放推荐用boost::shared_ptr
[/Quote]

对的,这个最好,对于vector千万别用auto_ptr,因为赋值改变原对象的行为不符合STL容器的语义
密斯刘 2010-10-26
  • 打赏
  • 举报
回复
删除了指针,但是并没有自动调用Base的析构函数。你测试一下就知道了。vector没有clean函数,只有clear函数。O(∩_∩)O~

#include <iostream>
#include <vector>
using namespace std;

class Base
{
private:
int value;
public:
Base():value(0)
{
cout << "Constructor" << endl;
}
~Base()
{
cout << "Destructor" << endl;
}
};

int main()
{
vector<Base *> baseList;

Base *base1 = new Base();
Base *base2 = new Base();
Base *base3 = new Base();

baseList.push_back(base1);
baseList.push_back(base2);
baseList.push_back(base3);

baseList.clear();

return 0;
}

输出:

Constructor
Constructor
Constructor
pengzhixi 2010-10-26
  • 打赏
  • 举报
回复
你new了当然你要delete。
gules 2010-10-26
  • 打赏
  • 举报
回复
vector内的元素,在vector析构时或clear、erase等删除操作时,其元素对象本身是会被自动析构的;但你在vector内存放的是指针,那么被析构是的指针对象本身,而指针所指的对象不会被析构,需要手动析构(循环delete)之。
chainyu 2010-10-26
  • 打赏
  • 举报
回复
没有,如果要放推荐用boost::shared_ptr
linsen_519 2010-10-26
  • 打赏
  • 举报
回复
要知道push_back()的动作只是存入一个副本~

64,636

社区成员

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

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