这个辛格尔顿类会在被破坏时自动释放内存吗

Will this Singleton Class Automatically Release Memory upon Destruction?

本文关键字:内存 释放      更新时间:2023-10-16

我创建了一个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