memory destructor中文 - C++釋放靜態變量




call manually (5)

我希望我的類有一個靜態指針指向動態分配的內存區域。 我理解如何初始化它 - 在我的情況下,我將在第一個對象需要它時初始化它。 但是,我不知道在代碼中何時/何處釋放它。 我想在程序終止時釋放它。

我可能能夠在我的對象的析構函數中釋放指針,但是我必須維護一個對象計數,以查看當對像是最後使用的對象時是否可以安全釋放。

有沒有更優雅的方式來做到這一點?

請告訴我。

謝謝,jbu


Answers

你有兩個解決方案:

  1. 不要刪除刪除它 (你使用的是C ++,你使用new和delete,對吧?;))。 今天幾乎所有操作系統都會在應用程序完成後“釋放”應用程序分配的內存。 但這不是一個好的解決方案,例如,使內存洩漏難以檢測。
  2. 將指針封裝到類(作為成員)中 ,然後使用此類作為靜態類型。 這樣,您就知道將在應用程序結束時調用類析構函數。 然後,您只需在析構函數中刪除數據,即可完成工作並清理。 這就是RAII的力量。

我建議你做2,這是一個非常乾淨的方法。

這是一個簡單的例子。 而不是這樣做

static Thing* things = new Thing(); // or whatever way to initialize, here or in a specific function

你會這樣做:

class ThingManager // or whatever name you like
{
public:
   ThingManager( Thing* thing ) : m_thing( thing ) { }//or create it here? whatever solution suits your way of creating the data

   ~ThingManager() { delete m_thing; } // THAT's the important part!

    Thing* instance() const { return m_thing; } // or whatever accessor you need, if you need one

private:
    Thing* m_thing;
};

接著

static ManagedThing thing; // now i can access it via thing.instance() 

當程序結束時,靜態變量(不再是指針)將被銷毀,並且將調用它的析構函數來執行該操作。

它只是為了讓您了解如何做到這一點。


我會在類中定義一個靜態計數器來跟踪對象實例計數,因為析構函數得到執行它遞減計數器,如果counter == 0也釋放內存..就像你一樣


從操作系統的角度來看,在程序終止時釋放內存沒有任何意義,所有這一切都是緩慢終止。 終止您的應用程序會破壞整個地址空間,它會立即釋放您在堆上分配的所有內容。 明確地在app關閉時調用free只是在堆中移動指針,無論如何都會丟棄。

我們如此努力地明確釋放所有內容的主要原因是為了確保我們不會洩漏內存並且我們的內存佔用不會永遠增長。

但是,如果您可以確定這是靜態的,那將只有一個,並且在您釋放所有其他對象之前無法安全地釋放它,這是一個允許應用程序更好的情況終止為你照顧它。


您可以將靜態變量聲明為智能指針,然後當程序完成時,將釋放分配的指針。


這個答案是從free()怎麼知道要釋放多少內存? 在那裡,我被嚴格禁止回答一個明顯重複的問題。 這個答案應該與這個重複相關:

對於malloc的情況,堆分配器將原始返回指針的映射存儲到稍後free內存所需的相關詳細信息中。 這通常涉及以與正在使用的分配器相關的任何形式存儲存儲器區域的大小,例如原始大小或用於跟踪分配的二進制樹中的節點或正在使用的存儲器“單元”的數量。

如果您“重命名”指針或以任何方式複制指針,則free不會失敗。 然而,這並不是參考數字,只有第一次free才是正確的。 額外的free是“雙倍免費”的錯誤。

嘗試free與以前的malloc返回的值不同的任何指針,但尚未確定是錯誤。 部分釋放從malloc返回的內存區域是不可能的。





c++ memory static free destructor