2

我有一个单例类如下:

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()应用程序关闭之前。

4

3 回答 3

1

您可以使用智能指针而不是原始指针,然后您不必考虑它:)

如果您使用的是 C++11,则可以使用unique_ptr。如果您使用的编译器比使用auto_ptr.

此外,上面的代码不是线程安全的。

于 2013-08-27T05:38:14.387 回答
1

如果对象在程序关闭之前一直存在,则不必释放它。但是,您可能希望在关闭时释放单例所持有的资源(文件、套接字、数据库连接等);您可以使用在正常程序关闭期间调用的静态“取消初始化”函数来执行此操作。

顺便说一句,你初始化单例的方式不是线程安全的。您可能想改用线程安全的单例

于 2013-08-27T05:38:37.280 回答
1

在这种情况下,您必须使用 main 中的指针(或在超出范围之前您可以访问它的任何地方)删除您的对象。

就像是:

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;
}

这样,您根本不必释放任何内存,因为它将与您程序中的所有其他静态变量一起自动释放。

于 2013-08-27T05:39:25.910 回答