我有一個在類中聲明的結構向量。我的問題是,我必須顯式釋放由類的析構函數分配的內存,或者是在我銷燬實例時自動完成的。在中,我是否必須在類析構函數中包含代碼以釋放向量的內存。釋放在類中分配的向量?
回答
如果您自行分配使用結構new
,那麼你需要使用delete
當你與他們完成解除分配它們。 std::vector
不會爲你做到這一點。
書中Effective C++(強烈推薦)中的項13表示使用對象來管理資源。這可以幫助您避免出現問題,例如不必擔心資源釋放代碼未被調用,因爲例如引發了異常。如果您使用的是C++ 11,則可以查看shared_ptr或僅創建您自己的資源管理類。
更新:正如jogojapan指出的,std :: auto_ptr不適合STL容器。
[爲什麼在標準容器中使用auto_ptr有問題?](http://stackoverflow.com/questions/111478/why-is-it-wrong-to-use-stdauto-ptr-with-standard-containers) – jogojapan
Ahh ..謝謝@jogojapan我總是忘記那個..我會更新我的回答 – sjs
如果你使用'new'分配東西,你必須使用'delete'釋放它們。 free用於'malloc'的分配。 – Pixelchemist
如果你沒有析構函數並且向量是類成員,它將被編譯器生成的默認析構函數包含在內。
默認析構函數調用派生類的基類和 成員的析構函數。
基類和成員的析構函數被稱爲在反向 順序其構造的完成:
一類對象的析構被稱爲用於 成員和鹼析構函數之前被調用。非靜態成員的析構函數在調用基類的析構函數之前調用 。析構函數 非虛擬基類在調用虛擬基類的析構函數之前調用 。
而且你通過自己提供的析構函數:
類的析構函數(不論你是否顯式地定義) 自動調用成員對象的析構函數。它們是 以相反順序銷燬,它們出現在 該類的聲明中。
引用的來源是什麼? – jogojapan
「如果你沒有析構函數」事實上並不是破壞非靜態類成員的先決條件,因爲它們的銷燬將在析構函數體執行後發生。 – Pixelchemist
不管你是否有自己的析構函數: 你的類的每個成員都會調用它的析構函數(記住:如果成員是一個指針並且你手動分配了內存,你需要釋放析構函數中分配的內存由於自動銷燬會破壞指針,但不會釋放它指向的內存)。
C++標準規定,在析構函數體後,所有非變量非靜態數據成員都將調用它們的析構函數。
- 1. 分配,釋放,分配變量
- 2. 從類方法分配/釋放指向數組的方法
- 3. STL向量釋放
- 4. 釋放變量並再次分配
- 5. 分配和釋放一個類
- 6. 在結構中釋放gsl向量
- 7. 釋放分配的內存
- 8. 在openCV中釋放內存分配
- 9. 在C++中分配和釋放內存
- 10. 在C++中分配和釋放char *
- 11. 釋放分配給指針的內存vs釋放分配給指針指向的內存
- 12. 如何釋放此分配?
- 13. 分配和釋放問題
- 14. 內存分配和釋放
- 15. 用std :: allocator釋放分配
- 16. 分配和釋放內存
- 17. NSString分配/釋放/保留
- 18. 內存分配釋放
- 19. 如何'釋放'分配給外殼中變量的內存
- 20. C++向量中動態分配向量?
- 21. 從指針向量中釋放內存
- 22. 在dealloc中釋放的ivars給「指針被釋放沒有分配」的錯誤
- 23. 從類方法中釋放分配的內存
- 24. 無法釋放指向先前分配的結構的指針
- 25. 釋放內存分配給Java中
- 26. 釋放在返回指向該內存的函數中分配的內存(C++)
- 27. 釋放已分配UIViews的NSMutableArray是否會釋放UIViews?
- 28. 將值分配給向量的向量
- 29. 分配在我viewDidLoad方法釋放類對象
- 30. 在C中的宏中有條件釋放分配的內存
你使用什麼向量? – TieDad
編號'std :: vector'在其生命週期結束時將其內容破壞。 – congusbongus
@EvanLi std ::矢量 – Iowa15