[英]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");
指針本身將一直存在,直到程序關閉。 然而,它指的是公平游戲。 您可以隨時免費使用。
如果您擔心的是內存泄漏,那么您可以看到以下幾個選項:
只是讓它泄漏。 程序中的所有內存將在關閉時釋放。 但是,如果您需要的不僅僅是釋放的內存(就像您想要運行析構函數一樣),那么這不是一個好主意。
有一個靜態成員變量,用於跟蹤已創建的類的實例數。 當內存達到零時釋放內存,如果內存再次高於0則重新分配內存。
有一種在程序關閉時運行的某種功能,並且擔心釋放內存。
如果可以,那就讓它不再是指針了。 如果它不是指針,你不必擔心它。
使用智能指針或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 clas
的members of the clas
而不是作為instance in each object of the class
。 因此,如果某人使用::
並動態分配內存來訪問靜態變量,則destructor
將不會出現,並且內存不會被刪除,因為沒有創建對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.