簡體   English   中英

即使指針在函數堆棧中,我也必須刪除它嗎?

[英]Do I have to delete pointer even if it is in function stack?

總是刪除指針,即使它只是在函數調用堆棧中? 函數棧釋放時它不消失了嗎?

// just Simple class
class CSimple{
  int a;
}

// just simple function having pointer.
void simpleFunc(){  
  CSimple* cSimple = new CSimple();
  cSimple->a = 10;
  //.. do sth
  delete cSimple;  // <<< Always, do I have to delete 'cSimple' to prevent the leak of memory?
}

void main(){
  for( int =0 ; i< 10 ; i++){
     simpleFunc();
  }

}

函數堆棧何時釋放?

當函數返回時,“ CSimple * csimple”確實消失了。

但是,指針與其指向的對象之間存在很大差異。

當指針對象被銷毀時,指針所指向的內容什么也沒有發生。 這里不僅有一個,而且還有兩個對象:

  1. 指針。

  2. 它指向的是什么。

在這種情況下,指針指向使用new創建的動態范圍內的對象。

該對象什么也不會發生,否則,您將泄漏內存。

因此,該對象需要delete d。

了解並充分理解這個概念之后,下一步就是打開C ++書籍,進入有關std::unique_ptrstd::shared_ptr類的章節,這將處理這些令人討厭的細節,為了你。 您應該學習如何使用它們。 現代的C ++代碼很少需要delete某些內容。 這些智能指針可以完成所有工作。

是。

在范圍退出時(例如,當函數存在或塊{...}完成時),在堆棧上創建的所有對象將被銷毀,內存將被釋放。

這適用於您的情況,即。 指針將被銷毀,並且指針所占用的內存將被釋放。 指針指向的對象將不會被清除。

當您處理多個流路徑(if-else階梯,許多return語句)和異常時,這是一個普遍的問題,也是一場噩夢。

為了解決這個問題,我們采用了兩種主要策略:

  1. RAII
  2. 智能指針( std::unique_ptrboost::scoped_ptr ,舊版std::auto_ptr等)。

RAII-無需學術考慮-只是在堆棧上創建對象,如下所示:

{
   std::string s;
   fancy_object obj;
}

當我們退出他的作用域時, objs析構函數將被稱為duing stack unwinding。 編譯器會確保所有流路都如此,並會為我們保持正確的釋放順序。

如果需要在堆上分配內存,請使用new ,請使用智能指針。

int foo()
{
    std::unique_ptr<Object> o(new Object);
    ... some more code ...
    if( something ) { return -1 }
    ... some more code ...
    if( something_else ) { return -2 }
    else { not yet }
    return 0;
}

如您所見,我們可以使用3個“ exists”離開范圍。 通常,在所有情況下都需要清除內存,這很容易導致人為錯誤。

無需在所有3種情況下手動清除對象,而是依靠自動析構函數調用堆棧上創建的對象。 編譯器會解決。 當我們離開范圍時,將調用std::unique_ptr析構函數,並在Object上調用delete

不要被聰明的笨蛋所寵愛。 它們不是“慢”,“膨脹”或其他廢話。 智能Poiners的設計沒有訪問開銷,從而增加了額外的安全性。

非常類似的技術用於鎖。 查看std::lock_guard類。

是的,您必須delete所指向的數據。

指針本身在堆棧上,不需要刪除。

但是,您可以將cSimple存儲在堆棧中,然后不必刪除它:

void simpleFunc(){  
  CSimple cSimple; // no new
  cSimple.a = 10; // "." instead of "->"
  //.. do sth
  // no deletion
}

暫無
暫無

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

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