c++ - manually - destructor中文



C++釋放靜態變量 (4)

你有兩個解決方案:

  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() 

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

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

https://code.i-harness.com

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

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

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

請告訴我。

謝謝,jbu


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

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

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


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


把它扔進智能指針。 它將具有靜態生命週期並在main返回後被銷毀:

static std::auto_ptr<T> thePointer;

另一個選擇是註冊自己的atexit函數:

// static
void YourClass::freePointer(void)
{
    delete getPointer();
}

// static
T* YourClass::getPointer(void)
{
    if (!thePointer)
    {
        thePointer = new T;
        atexit(freePointer);
    }

    return thePointer;
}

哪個會產生同樣的效果。 您已經提到的另一個選擇是保留一個靜態計數器。 請注意,您實際上可以非常有效地包裝它。





destructor