C++ 如何删除许多类中使用的单例对象
C++ how to delete Singleton object's used in many classes
假设我有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实例。
相关文章:
- 为什么在单例中,检查类==空?
- 带有抛入 ctor 的对象的单例 - 再次访问?
- 如何将项目共享"system calls"作为单例对象构建和链接到引导加载程序?
- 使用指针和使用静态对象实现单例实现之间的区别
- 带参数的单例模式对象
- c++中的静态对象与单例类对象
- 派生自单例:基数和派生各一个对象
- 我们是否需要互斥锁来访问 C++11 - 多线程中单例对象中的数据字段
- 此单例对象创建代码中的错误是什么
- 如何正确地创建一个单例对象并在C++中使用它
- 具有可变成员的单例对象
- 非静态成员引用必须相对于特定的c++对象单例类
- c++中的一个单例应用程序对象
- 如何删除单例对象
- 当动态创建的单例对象应该被删除时
- 在初始化列表中创建单例对象会导致访问冲突(仅释放模式)
- 为什么单例是比全局对象更好的选择
- 对单例对象c++使用函数指针
- 单例对象初始化
- C++ 如何删除许多类中使用的单例对象