Vector:clear/pop_back不会运行析构函数

Mag*_*xis 2 c++ destructor vector irrlicht

我有一个"Pictureframe"的矢量(pflist),我想要销毁所有这些.所以我运行pflist.clear(); 文档说这会运行向量中每个项目的析构函数,但事实并非如此!

我有一个:

vector<Pictureframe*> pflist;
Run Code Online (Sandbox Code Playgroud)

剩下的就是:

class Pictureframe{
    scene::IMeshSceneNode *picture;
    scene::IMeshSceneNode *frame;

public:
    Pictureframe();
    ~Pictureframe();
};
Run Code Online (Sandbox Code Playgroud)

然后在cpp文件中:

Pictureframe::~Pictureframe(){
//  delete picture;
//  delete frame;
    cout<<"Destructor Called.\n\n";
}
Run Code Online (Sandbox Code Playgroud)

在视线中没有"被叫的破坏者"!这就是我所说的:

pflist.clear();
Run Code Online (Sandbox Code Playgroud)

我确信这条线正在运行,并且由5个相框组成.我还尝试了一个通过矢量pop_back'ing的for循环,这也有同样的问题.

所以Destructor,YU NO CALL?

Pra*_*ian 7

你的问题没有说明它的类型std::vector.如果类型是,std::vector<Pictureframe *>则在调用时不会调用每个元素的析构函数std::vector::clear.在这种情况下,在清除向量之前,您有责任对delete这些对象进行操作.

如果您不需要动态分配这些对象,请将矢量类型更改为std::vector<Pictureframe>.用它作为:

std::vector<Pictureframe> vec;
vec.push_back( Pictureframe( ... ) );
// do stuff
vec.clear();
Run Code Online (Sandbox Code Playgroud)

现在将调用每个对象的析构函数.请记住创建一个复制构造函数和赋值运算符,Pictureframe因为它看起来像是在管理某些资源.

如果必须动态分配Pictureframe对象,请将向量更改为

std::vector<std::unique_ptr<Pictureframe>> vec;
vec.push_back( std::unique_ptr<Pictureframe>( new Pictureframe( ... ) ) );
// do stuff
vec.clear();
Run Code Online (Sandbox Code Playgroud)

unique_ptrdelete在这种情况下会自动对象.

其他替代品boost::shared_ptr代替std::unique_ptr或boost::ptr_vector.

  • 更准确地说,运行容器_will_中每个元素的析构函数.但是,指针的析构函数是无操作符. (3认同)