我有一个单例类,它的实例在类的 CPP 文件中的全局范围内被初始化:
Singleton* Singleton::uniqueInstance = new Singleton();
它的头文件是这样的:
class Singleton {
public:
static Singleton& getInstance() { return *uniqueInstance; }
static bool destroyInstance() { delete uniqueInstance; }
private:
//...
//... typical singleton stuff
static Singleton* uniqueInstance;
}; // end of class Singleton
我注意到它的析构函数在程序终止期间不会被执行,因此我添加了一个公共(public)静态接口(interface)Singleton::destroyInstance()
,以便在程序退出之前由客户端代码手动调用,例如删除。这个片段不是完整的代码,假设还有其他代码处理线程安全问题。在这种情况下,如何利用RAII来避免引入这样的接口(interface)呢?感谢您的建议。
最佳答案
析构函数不会被自动调用,因为全局对象是一个指针,而不是对象本身。如果您要像这样声明全局对象:
Singleton Singleton::uniqueInstance();
然后自动调用析构函数。但是,您将无法准确控制何时 调用构造函数和析构函数(与其他全局对象的构造和销毁相关)。如果这对你来说不重要,那么你可以使用上面的方法。
关于c++ - 单例RAII,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1932054/