2012-05-22 93 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?