我创建了一个Singleton类,我想知道我的析构函数是否会自动释放名为instance
的静态变量的内存。
以下代码会自动释放内存吗?
class SingletonClass
{
SingletonClass()
{
}
~SingletonClass()
{
delete this; // or should I say... delete instance;
}
public:
static SingletonClass* instance;
SingletonClass* getInstance()
{
if (instance != NULL)
return instance;
instance = new SingletonClass();
return instance;
}
};
PS:是否可以只使instance
成为常规的Singleton变量而不是指针?是不是更好的代码练习?
答案 0 :(得分:4)
这个单身人士在你的程序中快速注入未定义的行为。
您有一个static
成员变量,它具有自动存储空间。作为一个全局变量,它将在输入main()
例程之前构建,并在main()
例程退出后被破坏。
因此,一旦您的程序终止并退出main()
函数,您的SingletonClass
实例的析构函数将被调用,它将尝试delete this
;但是,该对象未通过调用new
进行分配,并且调用delete
未通过new
分配的对象会给出未定义的行为。
您可以安全地删除delete this
指令:程序终止时会自动销毁全局对象。
编辑:
在对您的问题进行修改之后,曾经是static
类型SingletonClass
变量的变量成为static
类型的SingletonClass*
变量。我建议你改回来:
static SingletonClass instance;
SingletonClass* getInstance()
{
return &instance;
}
实际上,instance
可能(并且可能应该)甚至是static
函数getInstance()
的局部变量:
SingletonClass* getInstance()
{
static SingletonClass instance;
return &instance;
}
这样您甚至不必为static
类成员变量提供全局定义。
或者,你可以使用智能指针来处理对象的生命周期,但这里没有必要。只需将变量声明为static
的{{1}}局部变量即可。在C ++ 11中,它的初始化也将保证线程安全。
答案 1 :(得分:3)
使用智能指针,如
static std::unique_ptr<SingletonClass> instance;
当程序终止时,它会删除您的实例。除非你真的知道自己在做什么以及后果是什么,否则请避免代码成员使用delete this
。