[英]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
塊,因為總有解決方法。 現在,如果我想創建一個類,我有兩種方法:
THuman male;
在塊{... code ...}
結束時創建對象然后超出范圍的對象
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賦給對象,我是否仍然需要調用刪除?
delete
以從堆中釋放先前分配的內存,然后再為其指定NULL
。 否則你會泄露資源。 要檢查程序內存管理,可以運行valgrind 在方法2(我們在堆中)如果我將值NULL賦給對象,我是否仍然需要調用刪除?
如果在調用delete之前執行此操作,則泄漏內存,如果在NULL指針上調用delete,則會出現seg錯誤(應用程序崩潰)。
最好的方法是使用堆棧對象,但如果需要管理對象的存在,請使用上面建議的智能指針(unique_ptr,shared_ptr)。
注意:“泄漏內存”是指該區域丟失,無法從程序訪問,也無法通過操作系統釋放。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.