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

C++ how to delete Singleton object's used in many classes

本文关键字:对象 单例 许多类 何删除 删除 C++      更新时间:2023-10-16

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

这个类可以像这样:

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类中,它"足够"吗?

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

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

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