这个Singleton类会在销毁时自动释放内存吗?

时间:2013-02-21 02:22:49

标签: c++ memory-management singleton raii

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

2 个答案:

答案 0 :(得分:4)

这个单身人士在你的程序中快速注入未定义的行为

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

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

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

编辑:

在对您的问题进行修改之后,曾经是static类型SingletonClass变量的变量成为static类型的SingletonClass*变量。我建议你改回来:

static SingletonClass instance;

SingletonClass* getInstance()
{
    return &instance;
}

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

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

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

或者,你可以使用智能指针来处理对象的生命周期,但这里没有必要。只需将变量声明为static的{​​{1}}局部变量即可。在C ++ 11中,它的初始化也将保证线程安全

答案 1 :(得分:3)

使用智能指针,如

 static std::unique_ptr<SingletonClass> instance;

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