c++ - 单例RAII

标签 c++ design-patterns singleton

我有一个单例类,它的实例在类的 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/

相关文章:

c++ - 使用 'using' 指令隐藏名字

c# - 在 RasDial 之后获取 IP 地址/接口(interface)号

javascript - 单例访问私有(private)方法访问公共(public)方法

design-patterns - 设计问题: Owning a class with many different subclasses

python - 使用 exec 进行变量赋值是Pythonic吗?

c++ - 模板模板可变参数特化

c++ - 跨依赖类的状态一致性

ios - 在 VIewController 之间共享数据 - iOS

python - 什么是单例/博格模式?为什么他们不适合我/我的概念哪里错了?

java - 如何在 Java 中正确制作线程安全的单例工厂?