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

标签 c++ vector destructor irrlicht

我有一个“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/

相关文章:

c++ - C++中的析构函数执行顺序

c++ - 如果不是手动完成,子类是否会继承父类的析构函数?

r - 如何将栅格数据和矢量数据映射在一起?

递归方法中的c++凸包

c++ - 在 C++ 中对 vector 使用函数

c++ - 为什么我的析构函数只被调用一次而不是在 delete(a) 调用中?

c++ - 阅读/理解第三方代码

c++ - 如何返回使用参数包定义的成员函数的 std::function 对象?

c++ - OpenMP 矩阵乘法嵌套循环

c++ - 我在哪里可以找到 SVN .lib 文件?