C ++如何删除许多类中使用的Singleton对象

时间:2014-03-09 11:33:09

标签: c++ memory memory-management singleton

假设我有3个班级(A,B和C)。每个类都有一个Singleton类的实例变量,并在该类的某些函数中使用该实例变量。

这个类看起来像这样:

SingletonClass* mSingletonClass; // declared in header file

mSingletonClass = SingletonClass::getInstance(); // called in constructor

mSingletonClass->doSomething();     // called in function doSomething()
mSingletonClass->doSomething1();    // called in function doSomething1()

SingletonClass.h

class SingletonClass : public QObject {
    Q_OBJECT
public:
    static SingletonClass* getInstance();

    // some functions
private:
    SingletonClass();
    SingletonClass(SingletonClass const&);
    SingletonClass& operator=(SingletonClass const&);
    static SingletonClass* mInstance;
};

SingletonClass.m

SingletonClass* SingletonClass::mInstance = 0;

SingletonClass* SingletonClass::getInstance() {
    if (!mInstance) {
        mInstance = new SingletonClass();
    }

    return mInstance;
}

SingletonClass::SingletonClass() : QObject() {
}

我应该如何delete实例变量?

如果我在每个解构器(A,B和C)上调用delete mSingletonClass;,应用程序崩溃。

如果我只调用delete mSingletonClass;一次,例如在A类中,它是否“足够”?

2 个答案:

答案 0 :(得分:3)

您永远不会在使用它的任何类中销毁单例对象。单例是一个单例的原因是你的系统中只有一个实例,创建一次,并永远保存,直到你的程序即将退出。

John Vlissides在他的C ++ Report文章To Kill A Singleton中讨论了一种摧毁单身人士的方法。他建议使用一个特殊的“守卫”对象,在破坏时删除指向单身的指针。在现代C ++中,您可以通过将unique_ptr<T>指向单例的实例来实现相同的效果(您可以将其用于mInstance变量)。

答案 1 :(得分:1)

您可以在SingletonClass中放置一个静态成员变量(例如SingletonClassDestroyer)来帮助销毁它,因为静态成员变量的生命周期在程序终止时结束。 SingletonClassDestroyer应该使用SingletonClass实例并在其自己的析构函数~SingletonClassDestroyer()中销毁它。因此,SingletonClassDestroyer将帮助您最终自动销毁SingletonClass实例。