我有一个单身课程如下:
class myClass
{
public:
static myClass* getInstance();
~myClass();
private:
static myClass* m_instance;
protected:
myClass();
};
以及上面的类定义是:
myClass* myClass::m_instance = 0;
myClass::myClass()
{
}
myClass::~myClass()
{
}
myClass* myClass::getInstance()
{
if(m_instance == 0)
m_instance = new myClass;
return m_instance;
}
众所周知,一旦内存分配了new
,它应该被释放到堆中以防止内存泄漏。在我的情况下,我已经分配了与析构函数无关的内存,因为它是静态的。
那么,我该如何释放分配的内存?我应该释放它吗?这不会导致内存泄漏,因为我还有其他类的对象在main()
中运行吗?
PS:getInstance()
方法返回的对象存在于main()
中,直到关闭应用程序。
答案 0 :(得分:1)
您可以使用智能指针代替原始指针,然后您不必考虑它:)
如果您使用的是C ++ 11,则可以使用unique_ptr。如果您使用的是较旧的编译器,请使用auto_ptr
。
此外,上面的代码不是线程安全的。
答案 1 :(得分:1)
如果对象一直持续到程序关闭,您不一定要释放它。但是,您可能希望在关闭时释放单例持有的资源(文件,套接字,数据库连接等);您可以使用在正常程序关闭期间调用的静态“取消初始化”函数来执行此操作。
顺便说一句,初始化单例的方式不是线程安全的。您可能希望改为使用threadsafe singleton。
答案 2 :(得分:1)
在这种情况下,您必须使用主要指针(或者在超出范围之前可以访问它的任何地方)删除对象。
类似的东西:
int main()
{
myClass* inst = myClass::getInstance();
// ... do something with it here
delete inst;
}
虽然这通常是一种不好的做法,因为你的程序中的任何地方都不应该有新的/删除“乱跑”。最好坚持RAII概念,并使用构造函数和析构函数将堆存储的内存与堆栈中的某些对象绑定。
在这种特定情况下 - 您可以将m_instance声明为静态,而不是在“getInstance()”中使用“new mClass”。
myClass& myClass::getInstance()
{
static myClass instance;
return instance;
}
这样您就不必释放任何内存,因为它会随程序中的所有其他静态自动释放。