我有一个“Pictureframe”的 vector (pflist),我想销毁所有这些。所以我运行 pflist.clear();文档说这会运行 vector 中每个项目的析构函数,但事实并非如此!
我有一个:
vector<Pictureframe*> pflist;
剩下的是:
class Pictureframe{
scene::IMeshSceneNode *picture;
scene::IMeshSceneNode *frame;
public:
Pictureframe();
~Pictureframe();
};
然后在cpp文件中:
Pictureframe::~Pictureframe(){
// delete picture;
// delete frame;
cout<<"Destructor Called.\n\n";
}
看不到“调用的破坏者”!这是我称之为的地方:
pflist.clear();
我确定这条线正在运行,并且由 5 个相框填充。我还尝试了一个通过 vector pop_back'ing 的 for 循环,但它有同样的问题。
那么析构函数,你不调用吗?
最佳答案
您的问题没有说明 std::vector
的类型是什么是。如果类型是 std::vector<Pictureframe *>
那么当您调用 std::vector::clear
时,将不会调用每个元素的析构函数.在这种情况下,您有责任delete
这些对象在清除 vector 之前。
如果不需要动态分配这些对象,将vector类型改为std::vector<Pictureframe>
.用作:
std::vector<Pictureframe> vec;
vec.push_back( Pictureframe( ... ) );
// do stuff
vec.clear();
现在将调用每个对象的析构函数。请记住为 Pictureframe
创建复制构造函数和赋值运算符因为看起来类正在管理一些资源。
如果必须动态分配Pictureframe
对象,将 vector 更改为
std::vector<std::unique_ptr<Pictureframe>> vec;
vec.push_back( std::unique_ptr<Pictureframe>( new Pictureframe( ... ) ) );
// do stuff
vec.clear();
unique_ptr
会自动delete
本例中的对象。
其他选择是 boost::shared_ptr
而不是 std::unique_ptr
或 boost::ptr_vector
.
关于c++ - Vector:clear/pop_back 不会运行析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10696124/