假设我有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类中,它是否“足够”?
答案 0 :(得分:3)
您永远不会在使用它的任何类中销毁单例对象。单例是一个单例的原因是你的系统中只有一个实例,创建一次,并永远保存,直到你的程序即将退出。
John Vlissides在他的C ++ Report文章To Kill A Singleton中讨论了一种摧毁单身人士的方法。他建议使用一个特殊的“守卫”对象,在破坏时删除指向单身的指针。在现代C ++中,您可以通过将unique_ptr<T>
指向单例的实例来实现相同的效果(您可以将其用于mInstance
变量)。
答案 1 :(得分:1)
您可以在SingletonClass中放置一个静态成员变量(例如SingletonClassDestroyer)来帮助销毁它,因为静态成员变量的生命周期在程序终止时结束。 SingletonClassDestroyer应该使用SingletonClass实例并在其自己的析构函数~SingletonClassDestroyer()中销毁它。因此,SingletonClassDestroyer将帮助您最终自动销毁SingletonClass实例。