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

Nik*_*las 1 c++ memory singleton memory-management

假设我有 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()
Run Code Online (Sandbox Code Playgroud)

单例类.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;
};
Run Code Online (Sandbox Code Playgroud)

SingletonClass.m

SingletonClass* SingletonClass::mInstance = 0;

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

    return mInstance;
}

SingletonClass::SingletonClass() : QObject() {
}
Run Code Online (Sandbox Code Playgroud)

我应该如何delete处理实例变量?

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

如果我只打delete mSingletonClass;一次电话是否“足够” ,例如在 A 类中?

das*_*ght 6

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

John Vlissides 在其名为To Kill A Singleton 的C++ 报告文章中讨论了一种销毁单例的方法。他建议使用一个特殊的“保护”对象,在销毁时删除指向单例的指针。在现代 C++ 中,您可以通过将 a 指向unique_ptr<T>您的单例实例(您可以将它用于您的mInstance变量)来实现相同的效果。