如何在C++中释放静态成员变量?

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

指针本身将一直存在,直到程序关闭.然而,它指的是公平游戏.您可以随时免费使用.

如果您担心的是内存泄漏,那么您可以看到以下几个选项:

  1. 只是让它泄漏.程序中的所有内存将在关闭时释放.但是,如果您需要的不仅仅是释放的内存(就像您想要运行析构函数一样),那么这不是一个好主意.

  2. 有一个静态成员变量,用于跟踪已创建的类的实例数.当内存达到零时释放内存,如果内存再次高于0则重新分配内存.

  3. 有一种在程序关闭时运行的某种功能,并且担心释放内存.

  4. 如果可以,那就让它不再是指针了.如果它不是指针,你不必担心它.

  5. 使用智能指针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)

程序初始化时,调用构造函数并读取文件.程序退出时,将调用析构函数并销毁对象.