[英]What do I have to garbage collect in a C++ destructor
我正在編寫一個C ++析構函數(我希望這是正確的術語;我是C ++的新手)並且我對垃圾收集的確切需要並不是肯定的。 假設我有2個指針作為實例變量我需要垃圾收集嗎? 如果我有一個對象作為實例變量呢? 或指向對象的指針?
對於究竟需要刪除的內容以及自動清理的內容,我只是有點模糊。
謝謝
一般的經驗法則是......如果你打電話給new
,請撥打delete
。 如果您調用new[]
,請調用delete[]
。 如果您正在訪問類之外的這些指針並有效地共享它們,那么您將需要注意“擁有”對象在它們仍在使用時delete
共享對象。 垃圾收集不是一個正確的術語。 你想destroy
對象並free
它的記憶。 這就是delete
/ delete[]
作用。 new
/ new[]
分配內存並construct
一個對象。
在C ++中,沒有垃圾收集器。 你必須“手動”處理它。 這並不是說它是乏味的。 你可能會開始使用智能指針為你處理一些邏輯。 有關更多信息,請參閱此問題 。
您必須delete
使用new
分配的每個指針。 就這么簡單,而且那很復雜; 在delete
它之前,你不能忘記由new
分配的任何指針。
此外,您需要確保如果使用new[]
分配指針,則調用delete[]
來取消分配它。
這不是你在類實例中碰巧遇到的指針。 您需要知道誰擁有它們(所有者是負責刪除它們的人)。 如果您的對象擁有這些指針,那么它應該刪除它們。 如果它不擁有它們,那么它不應該擁有它們。
這也是有經驗的C ++程序員盡可能避免使用裸指針的原因。 智能指針允許您在語言中以語義表達所有權類型。 這樣,你就不必跟蹤誰擁有什么; 你知道誰使用的智能指針類型擁有它。
您必須在使用new
創建的每個空間上調用delete
,在使用new
delete[]
創建的每個區域上delete[]
new[]
,並在使用malloc
獲得的所有內容上free
。
您還應該關閉所打開的任何套接字,並清除您的類擁有的任何其他操作系統資源。
注意:這不稱為垃圾收集。 垃圾收集是指此過程自動發生,作為庫或語言運行庫的一部分,而不是在您明確執行時。
您應該首先了解“資源獲取是初始化”(RAII)和智能指針( shared_ptr
和unique_ptr
)。 如果你來自其他語言,這是你必須在C ++中知道的習語。
通常的做法是說你在構造函數中分配的任何東西都必須在你的析構函數中釋放(參見其他答案以了解如何)。 事件更好,嘗試盡可能多地使用值和盡可能少的new
值。 C ++喜歡堆棧,堆棧分配和釋放是自動且廉價的(沒有新的,沒有刪除)。 使用引用和const引用而不是指針。
如果您確實需要動態內存,請嘗試使用其中一個智能指針。
您需要釋放使用新運算符分配的任何內存。
通過執行以下操作分配內存
int * p1 = new int[5];
p2 = new int;
並通過執行以下操作刪除它:
delete[] p1
delete p2;
如果您正在使用Classes,則需要在構造函數(allocate)和析構函數(deallocate)中執行相同的操作。
在理想的世界里,沒有。 每種模式都有智能指針和容器。 有時,您必須編寫自己的,或擴充現有的實現,但您已經存在的大部分內容已存在。
對於數組,從std::array
和std::vector
。 對於對象,請閱讀智能指針和共享指針。 作為概括 :如果你需要調用delete
, delete[]
或free
,你通常會走錯路。
你需要垃圾收集你不再需要的所有指針。 否則你會有懸空指針問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.