簡體   English   中英

C ++對象堆棧和堆上的生命周期

[英]C++ objects lifetime on stack and heap

我正在嘗試翻譯我用Delphi制作的一些項目; 一般來說,對象可以聲明為:

//I have the control of the object and I MUST delete it when it's not needed anymore

male := THuman.Create();
try
 // code
finally
 male.Free; (get rid of the object)
end;

閱讀Stroustrup關於C ++的書我已經理解(簡而言之)他的語言不需要finally塊,因為總有解決方法。 現在,如果我想創建一個類,我有兩種方法:

  1. THuman male; 在塊{... code ...}結束時創建對象然后超出范圍的對象

  2. THuman* male = new THuman我可以控制對象的生命並用delete摧毀它


本書建議使用第一種方法(即使兩者都很好),但我來自Delphi背景,我想使用第二種方法(我有對象的控制)。

問題。 我無法理解C ++對於對象和在線閱讀的兩種方法之間的區別我有更多的困惑。 如果我說方法1在堆棧上分配內存並在堆上分配方法2,這是正確的嗎?

在方法2(我們在堆中)如果我將值NULL賦給對象,我是否仍然需要調用刪除?

例如,Delphi只允許在堆上創建實例,而Free刪除對象(如C ++中的delete )。

簡而言之

1-沒有使用new創建的對象具有自動生命周期(如您所說,在堆棧中創建,但這是大多數編譯器選擇的實現技術),一旦超出范圍,它們將自動釋放。

2-用new創建的對象的生命周期(在堆中創建,再次作為大多數編譯器的實現技術)需要由程序員管理。 請注意,刪除不是將指針設置為NULL,它應該在之前發生。 簡單的規則是:

  • 每個new必須匹配一個只有一個delete
  • 每個new[] (創建動態數組)必須匹配一個只有一個delete[]

ps: 匹配在這里涉及程序運行時中的一對一出現,不一定在代碼本身中(您可以控制刪除任何對象的時間和位置)。

如果我說方法1在堆棧上分配內存並在堆上分配方法2,這是正確的嗎?

在方法2(我們在堆中)如果我將值NULL賦給對象,我是否仍然需要調用刪除?

  • 考慮使用smartpointers而不是原始指針。 Smartpointers是處理指針資源並使其更安全使用的對象。 但是,如果您不能使用智能指針,請確保在指針上調用delete以從堆中釋放先前分配的內存,然后再為其指定NULL 否則你會泄露資源。 要檢查程序內存管理,可以運行valgrind

在方法2(我們在堆中)如果我將值NULL賦給對象,我是否仍然需要調用刪除?

如果在調用delete之前執行此操作,則泄漏內存,如果在NULL指針上調用delete,則會出現seg錯誤(應用程序崩潰)。

最好的方法是使用堆棧對象,但如果需要管理對象的存在,請使用上面建議的智能指針(unique_ptr,shared_ptr)。

注意:“泄漏內存”是指該區域丟失,無法從程序訪問,也無法通過操作系統釋放。

暫無
暫無

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

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