簡體   English   中英

C ++指針變量內存泄漏澄清

[英]C++ Pointer Variable Memory Leaking Clarification

假設我們有以下C ++代碼:

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

destructor()
{
     //delete Nodes;
}

這里的temp是局部指針變量,而CurrentNode是公共類屬性。 公共節點和相關事件節點在析構函數中釋放。 但是所有局部范圍的指針變量都會發生什么。 指針數據類型僅針對該地址就消耗一些內存,例如4字節或更多(取決於內存空間)。 在這里, temp局部變量不是用'new'初始化的,它只是指向其他一些節點的指針 ,基於此, temp局部變量是在堆棧還是在堆上? 退出該塊后,此局部變量會自動銷毀嗎?還是它是動態內存,但仍需要使用delete 我看到一些代碼的地方,沒有使用delete以釋放未用做當地的三分球new 我想確定他是否錯過了釋放變量的工作,或者還有其他我不知道的故事。 謝謝。

temp變量是被壓入堆棧的指針。 它超出范圍(即“ While”語句)后將被釋放。

如果未使用new分配變量(或未記錄有其他函數返回在堆上分配的某些東西,例如mallocmake_shared或其他內容),則它將具有自動存儲功能。

當包含范圍退出時,該變量將被銷毀。 如果您使用的是C ++,這是一個非常重要的概念,因為它構成了如何進行內存管理和其他資源管理的基本基礎。 搜索RAII以獲取更多詳細信息。

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

當您這樣創建一個指針時,它會分配在堆棧上,並在作用域的末尾回收:

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

當您動態分配內存(使用newnew[] )並將指針分配給內存地址並且在指針超出范圍並被回收之前不delete (或delete[] )內存時,就會出現內存泄漏的問題。 (此時您無法取消分配已分配的內存的方法)。

{ // 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函數的實現以及調用它時的“合約”。

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

退出包含塊時,所有局部變量都會自動銷毀。 對於指針和其他簡單的東西(整數,布爾值),這種破壞除了回收堆棧空間外不需要執行任何其他操作。 對於類類型的變量,析構函數將運行,從而允許它們進行任何所需的額外清理。

還請注意,如果您確實delete temp; 您會要求釋放temp指向的內存; temp本身仍然存在,您可以稍后為其分配一個新值。

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

處理局部變量時,需要一些技巧,例如,您可以在最終將被刪除的函數中使用類變量,或者可以聲明僅指向某個內存地址的指針,而無需實際為其分配內存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM