2013-07-20 35 views
1

假設我們有以下的C++代碼:C++指針變量的內存泄漏澄清

while(condition) 
{ 
    Node* temp = SomeNode->next; 
    //... 
} 

destructor() 
{ 
    //delete Nodes; 
} 

這裏temp是一個本地指針變量和CurrentNode是一個公共類屬性。公共節點和相關節點在析構函數中被釋放。但是,所有本地作用域指針變量會發生什麼。指針數據類型會佔用一些內存,例如4字節或更多(取決於內存空間),僅用於地址。 這裏,temp局部變量未初始化與「新」和僅僅是一個指向一些其他節點,在此基礎上,對堆棧或堆上做temp局部變量?此局部變量是否在退出塊後自動被破壞,或者是動態內存,但仍需要使用delete。我在某處看到一些代碼沒有使用delete來釋放並非由new製作的本地指針。我想確定他是否錯過了釋放變量或者有一些我不知道的其他故事。謝謝。

+0

請注意,儘管您在您的問題中引用了'CurrentNode',您的代碼示例中並未顯示'CurrentNode'。 – Sabuncu

+0

這並不重要。我在說明中澄清了。謝謝。 – Jahan

回答

2

如果變量不與new分配(或有書面文件,以返回在堆中分配,如mallocmake_shared,或任何東西的一些其他功能),那麼它有自動存儲。

當含範圍退出時,該變量被破壞。如果你使用C++,這是一個非常重要的概念,因爲它構成了內存管理和其他資源管理應該如何完成的基礎。搜索RAII瞭解更多詳情。

+0

我自己的答案有些挑剔,但只是爲了清楚地說明'make_shared'在技術上會返回一些會被自動銷燬的東西,但它會圍繞一些不是的東西。這種包裝會發生,以便非自動事物的生命週期與自動事物的生命週期相關聯。 – Joel

4

temp變量是推送到堆棧上的指針。它在超出你的「While」聲明的範圍之後被釋放。

2

可變temp是一個指向Node對象。根據你的系統,它很可能是一個存儲內存偏移量的整數。

當你做出這樣它被分配在棧上,並在範圍的端部回收的指針:

{ // Enter Scope 
    Object* pObj; // A local variable created on the stack 
} // pObj is reclaimed as would any other local variable. 

內存泄漏問題是當你動態地分配存儲器(使用newnew[])並且指針指向內存地址,並且在指針超出範圍之前並且不回收內存地址(在這一點上,您無法取消分配分配的內存)。

{ // Enter Scope 
    Object* pObj = new Object; // Local pointer to an Object in the heap 
} // pObj is reclaimed but the Object which it was pointed to is not. 
    // We have a memory leak. 

至於是否需要delete(或delete[])的temp變量,一切都取決於Node::next功能和「合同」,你調用它時具有的實施。

1

指針temp是在堆棧上;它指向的Node在堆上。

所有局部變量都自動銷燬當您退出包含塊。對於指針和其他簡單的東西(int,bools),這個銷燬除了回收堆棧空間外不需要做任何事情。對於類類型的變量,析構函數將運行,允許它們執行任何額外的清理操作。

另請注意,如果你做了delete temp;你會要求temp指向的內存被釋放;臨時本身仍然存在,您可以稍後爲其分配新的值。

1

內存管理的概念是刪除已經用new,alloc或malloc分配的內存,否則會有一些內存泄漏。顯然,管理分配內存的唯一方法是刪除。但是,這可以在析構函數中完成。其中,意味着只有類變量被刪除。因此,無法刪除在函數中定義的局部變量。因爲它們只存在於它們的範圍之內。

在處理局部變量,一些工藝要求即可以使用類變量,最終將被刪除的功能裏面,或者你可以聲明只會被指向一些內存地址,而實際上它分配一些內存的指針。

+0

非常感謝Juniar。 – Jahan