2012-05-22 49 views
0

我有一个“Pictureframe”的向量(pflist),我想销毁所有这些向量。所以我运行pflist.clear();该文档说,这将运行向量中每个项目的析构函数,但它不是!向量:clear/pop_back不会运行析构函数

我有一个:

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个pictureframes填充。我也尝试了一个for循环,它经历了向量pop_back'ing,并且有同样的问题。

所以破坏者,你没有电话?

+0

你确定你没有'PictureFrame *'的矢量吗? – juanchopanza

+1

你的矢量的类型是什么?它是'vector '还是'vector '? – Praetorian

+0

我会调整这个问题 – Magicaxis

回答

5

你的问题没有说明的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_ptrboost::ptr_vector

+0

非常感谢你这个答案的彻底性,你已经发现了,它是固定的! Muchos Gracias Senor – Magicaxis

+3

更准确地说,容器_will_中每个元素的析构函数都会运行。然而,指针的析构函数是一个空操作符。 –

1

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

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

我这个答案,一个老问题应该是一个良好的阅读:
Does vector::erase() destroy the removed object?