这个辛格尔顿类会在被破坏时自动释放内存吗
Will this Singleton Class Automatically Release Memory upon Destruction?
我创建了一个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变量,而不是指针?这会是更好的代码练习吗?
这个单例类愉快地在程序中注入未定义的行为。
您有一个具有自动存储功能的static
成员变量。作为一个全局变量,它将在进入main()
例程之前被构造,并在main()
例程退出之后被销毁。
因此,一旦程序终止并退出main()
函数,就会调用SingletonClass
实例的析构函数,并尝试delete this
;然而,该对象不是通过对new
的调用来分配的,并且为未通过new
分配的对象调用delete
会产生Undefined Behavior。
您可以安全地删除delete this
指令:当程序终止时,全局对象将自动销毁。
编辑:
在对您的问题进行编辑后,曾经是SingletonClass
类型的static
变量变成了SingletonClass*
类型的static
变量。我建议你把它改回:
static SingletonClass instance;
SingletonClass* getInstance()
{
return &instance;
}
实际上,instance
甚至可以(可能应该)是函数getInstance()
:的static
局部变量
SingletonClass* getInstance()
{
static SingletonClass instance;
return &instance;
}
这样,您甚至不必为static
类成员变量提供全局定义。
或者,您可以使用智能指针来处理对象的生存期,但这在这里是不必要的。只需将该变量声明为getInstance()
的static
局部变量即可。在C++11中,它的初始化也保证是线程安全的。
使用类似的智能指针
static std::unique_ptr<SingletonClass> instance;
当程序终止时,它会为您删除实例。除非您真正知道自己在做什么以及后果,否则请避免在代码的成员中使用delete this
。
- 包含矢量指针的结构的内存释放问题
- Valgrind 声称内存释放中的自由空间太多
- 当 C 和 C++ 中严格要求内存释放时
- C++ 中指针变量的内存释放
- 德克内存释放
- 临时对象 c++ 的内存释放
- C 全局对象变量内存释放
- C++矢量动态内存释放/删除
- 从 cv::Mat 初始化的 IplImage 的内存释放
- SWIG类型映射中的内存释放
- STL容器中的内存释放
- QWebView内存释放
- 内存释放 C++
- 大返回值(如字符串)的内存释放如何在C++中发生
- 重新分配之前的内存释放
- Linux C++ 中的内存释放
- VS2012编译器奇怪的内存释放问题
- 调试断言失败!错误的内存释放
- 负责 COM 互操作中的内存释放
- imread命令后OpenCV矩阵内存释放