use*_*831 5 c++ memory free static-members
任何人都可以解释如何释放静态成员变量的内存吗?根据我的理解,只有在类的所有实例都被销毁时才能释放它.此时我有点无助......
一些代码来解释它:
class ball
{
private:
static SDL_Surface *ball_image;
};
//FIXME: how to free static Variable?
SDL_Surface* ball::ball_image = SDL_LoadBMP("ball.bmp");
Run Code Online (Sandbox Code Playgroud)
Jon*_*vis 12
指针本身将一直存在,直到程序关闭.然而,它指的是公平游戏.您可以随时免费使用.
如果您担心的是内存泄漏,那么您可以看到以下几个选项:
只是让它泄漏.程序中的所有内存将在关闭时释放.但是,如果您需要的不仅仅是释放的内存(就像您想要运行析构函数一样),那么这不是一个好主意.
有一个静态成员变量,用于跟踪已创建的类的实例数.当内存达到零时释放内存,如果内存再次高于0则重新分配内存.
有一种在程序关闭时运行的某种功能,并且担心释放内存.
如果可以,那就让它不再是指针了.如果它不是指针,你不必担心它.
使用智能指针或auto_ptr.这样,当指针本身被破坏时,内存将被处理.
就个人而言,如果可以,我会建议4,如果你不能,我会建议5,但你有几种选择.
Pot*_*ter 11
从它的声音,你真的不想要一个指针.实际上,由于这是来自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;
Run Code Online (Sandbox Code Playgroud)
程序初始化时,调用构造函数并读取文件.程序退出时,将调用析构函数并销毁对象.