2

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

我有一个:

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 个相框填充。我还尝试了一个通过向量 pop_back'ing 的 for 循环,并且遇到了同样的问题。

所以析构者,YU NO CALL?

4

2 回答 2

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();

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

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

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_ptror boost::ptr_vector

于 2012-05-22T05:37:48.707 回答
2

我很确定你有一个std::vector<Pictureframe *>
Any 标准库容器不负责清除动态分配的指针元素。

您将不得不遍历std::vector并调用delete每个元素。

我对一个老问题的这个答案应该是一个很好的阅读:
向量::erase() 会破坏被移除的对象吗?

于 2012-05-22T05:24:54.233 回答