簡體   English   中英

如何在C ++中釋放靜態成員變量?

[英]How to free static member variable in C++?

任何人都可以解釋如何釋放靜態成員變量的內存嗎? 根據我的理解,只有在類的所有實例都被銷毀時才能釋放它。 此時我有點無助......

一些代碼來解釋它:

class ball
{
    private:
    static SDL_Surface *ball_image;
};
//FIXME: how to free static Variable?
SDL_Surface* ball::ball_image = SDL_LoadBMP("ball.bmp");

指針本身將一直存在,直到程序關閉。 然而,它指的是公平游戲。 您可以隨時免費使用。

如果您擔心的是內存泄漏,那么您可以看到以下幾個選項:

  1. 只是讓它泄漏。 程序中的所有內存將在關閉時釋放。 但是,如果您需要的不僅僅是釋放的內存(就像您想要運行析構函數一樣),那么這不是一個好主意。

  2. 有一個靜態成員變量,用於跟蹤已創建的類的實例數。 當內存達到零時釋放內存,如果內存再次高於0則重新分配內存。

  3. 有一種在程序關閉時運行的某種功能,並且擔心釋放內存。

  4. 如果可以,那就讓它不再是指針了。 如果它不是指針,你不必擔心它。

  5. 使用智能指針auto_ptr 這樣,當指針本身被破壞時,內存將被處理。

就個人而言,如果可以,我會建議4,如果你不能,我會建議5,但你有幾種選擇。

從它的聲音,你真的不想要一個指針。 實際上,由於這是來自C庫中的工廠函數,因此它實際上並不是“一流的”C ++指針。 例如,您無法安全地delete它。

真正的問題(如果有的話)是在程序退出之前調用SDL_FreeSurface

這需要一個簡單的包裝類。

struct smart_sdl_surface {
    SDL_Surface *handle;

    explicit smart_sdl_surface( char const *name )
        : handle( SDL_LoadBMP( name ) ) {}
    ~smart_sdl_surface()
        { SDL_FreeSurface( handle ); }
};

class ball
{
    private:
    static smart_sdl_surface ball_image_wrapper;
    static SDL_Surface *& ball_image; // reference to the ptr inside wrapper
};
smart_sdl_surface ball::ball_image_wrapper( "ball.bmp" );
SDL_Surface *&ball::ball_image = ball::ball_image_wrapper.handle;

程序初始化時,調用構造函數並讀取文件。 程序退出時,將調用析構函數並銷毀對象。

在這種情況下,靜態成員變量是一個指針。 你不能釋放它,但你可以釋放它指向的東西:

SDL_FreeSurface(ball_image);

然后,您可能希望將ball_image設置為0,以記錄您不再擁有圖像的事實。

如果“上課”是指ball ,那么沒有。 靜態成員ball繼續無論怎樣的許多情況下,存在ball有。 在程序退出之前,靜態成員可能被銷毀的唯一方法是,如果你做一些(依賴於實現)的事情,比如卸載包含類的dll。 但在這種情況下,靜態成員只是一個指針,因此(1)銷毀它只會破壞指針,而不是指針對象,並且(2)無論如何都不需要銷毀指針,它不會占用大量資源。

如果必須將靜態成員指向堆分配的內存,我會使成員成為智能指針。

靜態成員完全獨立於它所屬的類的所有實例。 您可以在程序中的任何位置刪除指針。 當然,這在語義上是否有意義是另一個問題。

我同意Jonathan M Davis的回答,但您可以考慮的另一個選擇是將您的圖像和其他資源從“域對象”中提取出來並轉移到ResourceManager類中,或者沿着這些方向。

ResourceManager可以是靜態的,也可以是基於實例的,並且可以提供加載和刪除資源的邏輯,這是我們應用程序的其余部分所需要的。

需要資源的類可以只保存一個引用或指向全局資源管理器的指針,並從管理器請求資源,而不是自己管理它們。

不需要刪除靜態成員變量。 如果你在課堂上有一個,那是因為你想在整個課程期間的任何時候使用它。 程序完成后,操作系統會聲明分配給它的總內存,包括任何未刪除的內存空間。

當然,如果您堅持刪除它,您可以創建一個特殊的靜態成員方法來執行它,並在程序中的所需位置調用該方法。 但我不推薦它給任何人,因為它違反了靜態成員變量的語義完整性,增加了復雜性以及隨着程序的增長而引起麻煩的可能性。

使用動態分配內存的static variable ,最好使用smart_pointer或手動清除內存的方法。

清除destructor中靜態變量的內存不適用於以下情況:由於靜態成員作為members of the clasmembers of the clas而不是作為instance in each object of the class 因此,如果某人使用::並動態分配內存來訪問靜態變量,則destructor將不會出現,並且內存不會被刪除,因為沒有創建對象。

暫無
暫無

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

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