簡體   English   中英

C++ 釋放靜態變量

[英]C++ freeing static variables

我希望我的班級有一個指向動態分配的內存區域的靜態指針。 我了解如何初始化它 - 就我而言,我將在第一個對象需要它時對其進行初始化。 但是,我不知道在代碼中何時/何地釋放它。 我想在程序終止時釋放它。

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

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

請告訴我。

謝謝,jbu

您在這里有兩種解決方案:

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

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

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

將其放入智能指針中。 它將具有靜態生命周期並在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;
}

這將具有相同的效果。 您已經提到的另一個選項是保留一個靜態計數器。 請注意,您實際上可以非常有效地將其包裝起來。

從操作系統的角度來看,在程序終止時釋放內存沒有任何意義,所做的只是緩慢終止。 您的應用程序眼淚就下來了你的整個地址空間終止,這將釋放你在堆上分配一下子一切 在應用程序關閉時顯式調用free只是在堆中混洗指針,無論如何都會被丟棄。

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

但是,如果您可以確定這是靜態的,並且只有一個,並且在釋放所有其他對象之前無法安全地釋放它,那么在這種情況下,最好讓 application終止為你照顧它。

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

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

當我試圖讓我自己的靜態指針在退出時被釋放時,我剛剛看到了這篇舊帖子。

正確的 C++ (C++11) 解決方案是使用智能指針,即std::unique_ptr<T>std::shared_ptr<T> ,其中 T 是您正在初始化的對象的類型。 這些模板管理對象的生命周期,並分別在對象超出范圍或成為內存中的最后一個引用時刪除對象。

暫無
暫無

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

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