谁能解释如何释放静态成员变量的内存?据我了解,只有当类的所有实例都被销毁时,它才能被释放。在这一点上,我有点无助……
一些代码来解释它:
class ball
{
private:
static SDL_Surface *ball_image;
};
//FIXME: how to free static Variable?
SDL_Surface* ball::ball_image = SDL_LoadBMP("ball.bmp");
谁能解释如何释放静态成员变量的内存?据我了解,只有当类的所有实例都被销毁时,它才能被释放。在这一点上,我有点无助……
一些代码来解释它:
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
s 而不是instance in each object of the class
. 因此,如果有人使用静态变量访问::
并动态分配内存,destructor
则不会出现在图片中并且内存不会被删除,因为没有创建对象。