2013-06-24 33 views
0

我有一個在類中聲明的結構向量。我的問題是,我必須顯式釋放由類的析構函數分配的內存,或者是在我銷燬實例時自動完成的。在中,我是否必須在類析構函數中包含代碼以釋放向量的內存。釋放在類中分配的向量?

+0

你使用什麼向量? – TieDad

+1

編號'std :: vector'在其生命週期結束時將其內容破壞。 – congusbongus

+0

@EvanLi std ::矢量 – Iowa15

回答

2

如果您自行分配使用結構new,那麼你需要使用delete當你與他們完成解除分配它們。 std::vector不會爲你做到這一點。

書中Effective C++(強烈推薦)中的項13表示使用對象來管理資源。這可以幫助您避免出現問題,例如不必擔心資源釋放代碼未被調用,因爲例如引發了異常。如果您使用的是C++ 11,則可以查看shared_ptr或僅創建您自己的資源管理類。

更新:正如jogojapan指出的,std :: auto_ptr不適合STL容器。

+1

[爲什麼在標準容器中使用auto_ptr有問題?](http://stackoverflow.com/questions/111478/why-is-it-wrong-to-use-stdauto-ptr-with-standard-containers) – jogojapan

+1

Ahh ..謝謝@jogojapan我總是忘記那個..我會更新我的回答 – sjs

+2

如果你使用'new'分配東西,你必須使用'delete'釋放它們。 free用於'malloc'的分配。 – Pixelchemist

2

如果你沒有析構函數並且向量是類成員,它將被編譯器生成的默認析構函數包含在內。

默認析構函數調用派生類的基類和 成員的析構函數。

基類和成員的析構函數被稱爲在反向 順序其構造的完成:

一類對象的析構被稱爲用於 成員和鹼析構函數之前被調用。非靜態成員的析構函數在調用基類的析構函數之前調用 。析構函數 非虛擬基類在調用虛擬基類的析構函數之前調用 。

而且你通過自己提供的析構函數:

類的析構函數(不論你是否顯式地定義) 自動調用成員對象的析構函數。它們是 以相反順序銷燬,它們出現在 該類的聲明中。

There are still the differences...

+0

引用的來源是什麼? – jogojapan

+1

「如果你沒有析構函數」事實上並不是破壞非靜態類成員的先決條件,因爲它們的銷燬將在析構函數體執行後發生。 – Pixelchemist

1

不管你是否有自己的析構函數: 你的類的每個成員都會調用它的析構函數(記住:如果成員是一個指針並且你手動分配了內存,你需要釋放析構函數中分配的內存由於自動銷燬會破壞指針,但不會釋放它指向的內存)。

C++標準規定,在析構函數體後,所有非變量非靜態數據成員都將調用它們的析構函數。