[英]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.