2012-06-12 49 views
2

我有一個包含向量成員變量的類。 我知道存儲在堆棧上的向量在 範圍內時會被清除(即釋放內存) ,但我不確定是否銷燬了包含向量成員變量的 類對象 - 被視爲超出範圍。C++刪除析構函數中的向量類成員內存

如果不是,有什麼適當的方法來破壞 的載體?

EG:

class fred { 
    char *stuff; 
    vector<int> v; 

    fred() : stuff(), v() {} 
    ~fred() { 
     if (stuff) free(stuff); 
     // now how do I clear up the vector v? Will it be done automatically? 
    } 
} 
+2

看到它是如何標記C++的,你可能希望'new/delete'在'malloc/free'上。 – chris

+2

矢量是好的。但'stuff'由於複製構造函數和賦值操作符而不安全(因爲編譯器會自動生成它們)。查看三條規則(或C++ 11中的五條規則)。 –

+1

在新的世界中,C++ 11-land,你不再自己調用delete。您可以使用unique_ptrs(通常)或shared_ptrs(很少)來爲您調用它。 – David

回答

0

當你摧毀弗雷德的實例爲載體的析構函數將被調用。

+2

'v'不一定就在堆棧上!這取決於這個'fred'的實例是否被分配到堆棧上 – David

+0

哦,對了!沒有考慮這種情況:( 感謝您的支持 – mtahmed

+0

如果它具有自動存儲持續時間,即堆棧分配實例,他可能不需要*銷燬* fred實例 – Praetorian

5

該矢量已爲您清理!當一個類被破壞時,它的所有成員析構函數也被調用。在這種情況下v的析構函數被調用,它清除它分配的任何東西。

當您按照與聲明相反的順序到達關閉析構函數}時,調用非靜態成員的dtors。然後調用基類析構函數(如果存在)。

+0

這很好,但我認爲如果我爲這個類編寫我自己的析構函數(不依賴於默認的析構函數),那麼就不會發生這種自動清理。將被調用,即使我有一個顯式的析構函數?? – bandjalong

+1

是的。對於所有非靜態非指針成員對象,當你到達這個成員的順序時,dtor會自動調用在類定義中定義(然後調用基類dtors,然後刪除基類成員,如果有的話,等等...)。 – dirkgently

+0

@dirkgently糾錯:成員被調用_reclared_在_reclared_類_declaration_ – David

0

我認爲你不需要爲矢量調用DTOR。 DTOR將在對象超出範圍時立即被調用,這意味着fred的DTOR被調用。

0

總是隻有一種方法可以銷燬一個對象,這是通過它的析構函數(相反,你可以用多種方式構造對象)。 STL容器專門設計用於避免數據結構中存儲器的這種微觀管理。如果你不得不在STL容器中顯式地分配或釋放內存,那麼你做錯了。