0

我创建了一个 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 变量而不是指针?这会是更好的代码练习吗?

4

2 回答 2

4

这个单例类在你的程序中愉快地注入了未定义的行为

您有一个static具有自动存储功能的成员变量。作为一个全局变量,它将在您的例程进入之前被构造,并在您的例程退出main()后被破坏。main()

因此,一旦你的程序终止并退出main()函数,你的SingletonClass实例的析构函数将被调用,它会尝试delete this;但是,对象不是通过调用分配的new,并且调用delete未分配的对象会new产生未定义的行为。

您可以安全地删除delete this指令:当您的程序终止时,全局对象会自动销毁。

编辑:

在对您的问题进行编辑后,曾经是statictype的变量SingletonClass变成了type 的static变量SingletonClass*。我建议你改回来:

static SingletonClass instance;

SingletonClass* getInstance()
{
    return &instance;
}

实际上,instance甚至可以(并且可能应该)是static函数的局部变量getInstance()

SingletonClass* getInstance()
{
    static SingletonClass instance;
    return &instance;
}

这样,您甚至不必为类成员变量提供全局定义。static

或者,您可以使用智能指针来处理对象的生命周期,但这在这里是不必要的。只需将变量声明staticgetInstance(). 在 C++11 中,它的初始化也将保证是线程安全的

于 2013-02-21T02:24:48.723 回答
3

使用智能指针,如

 static std::unique_ptr<SingletonClass> instance;

当程序终止时,它会为您删除实例。避免delete this在代码成员中使用,除非您真的知道自己在做什么以及后果是什么。

于 2013-02-21T02:30:24.597 回答