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?
你的问题没有说明它的类型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.