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

时间:2010-05-04 23:15:29

标签: 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");

8 个答案:

答案 0 :(得分:12)

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

如果您担心的是内存泄漏,那么我会看到一些选项:

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

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

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

  4. 如果可以,请将其设为不再是指针。如果它不是指针,你不必担心它。

  5. 使用smart pointerauto_ptr。这样,当指针本身被破坏时,内存将被处理。

  6. 就个人而言,如果可以,我会建议4,如果你不能,我会建议5,但你有几种选择。

答案 1 :(得分: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;

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

答案 2 :(得分:3)

在这种情况下,静态成员变量是一个指针。你不能释放它,但你可以释放它指向的东西:

SDL_FreeSurface(ball_image);

然后,您可能希望将ball_image设置为0,以记录您不再拥有图片的事实。

只有在类的所有实例都被销毁时才能释放它

如果“班级”是指ball,那么不。 ball的静态成员继续存在,无论有多少ball个实例。在程序退出之前,静态成员可能被销毁的唯一方法是,如果你做一些(依赖于实现)的事情,比如卸载包含类的dll。但在这种情况下,静态成员只是一个指针,因此(1)销毁它只会破坏指针,而不是指针对象,并且(2)无论如何都不需要销毁指针,它不会占用大量资源。

答案 3 :(得分:1)

如果必须将静态成员指向堆分配的内存,我会使成员成为智能指针。

答案 4 :(得分:1)

静态成员完全独立于其所属类的所有实例。您可以在程序中的任何位置删除指针。当然,这在语义上是否有意义是另一个问题。

答案 5 :(得分:1)

我同意Jonathan M Davis的回答,但您可以考虑的另一个选择是将您的图像和其他资源从“域对象”中提取到ResourceManager类中,或者沿着这些方向提取。

ResourceManager可以是静态的,也可以是基于实例的,并且可以提供加载和删除资源的逻辑,这是我们应用程序其余部分所需的。

需要资源的类只能保存一个引用或指向全局资源管理器的指针,并从管理器请求资源,而不是自己管理它们。

答案 6 :(得分:0)

不需要删除静态成员变量。如果你在课堂上有一个,那是因为你想在整个课程期间的任何时候使用它。程序完成后,操作系统会声明分配给它的总内存,包括任何未删除的内存空间。

当然,如果您坚持删除它,您可以创建一个特殊的静态成员方法来执行它,并在程序中的所需位置调用该方法。但我不推荐给任何人,因为它违反了静态成员变量的语义完整性,增加了复杂性以及随着程序的增长而引发麻烦的可能性。

答案 7 :(得分:0)

使用动态分配内存的static variable,最好使用smart_pointer或手动清除内存的方法。

清除destructor中静态变量的内存对以下情况不起作用: 由于静态成员以members of the clas而不是instance in each object of the class存在。因此,如果有人使用::访问静态变量并动态分配内存,则destructor将不会出现,并且内存不会被删除,因为没有创建对象。

相关问题