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 类中?
您永远不会在任何使用它的类中销毁单例对象。单例之所以是单例,是因为在你的系统中只有一个它的实例,创建一次,并且永远保存,直到你的程序即将退出。
John Vlissides 在其名为To Kill A Singleton 的C++ 报告文章中讨论了一种销毁单例的方法。他建议使用一个特殊的“保护”对象,在销毁时删除指向单例的指针。在现代 C++ 中,您可以通过将 a 指向unique_ptr<T>您的单例实例(您可以将它用于您的mInstance变量)来实现相同的效果。