c++ - 在我的案例中,我是否需要销毁单例实例?

标签 c++ singleton singleton-type

如果在我使用如下单例实例后进程终止。 是否存在内存泄漏?

  1. 如果是,我该如何解决这个问题?
  2. 是否需要添加“destroyInstance”成员函数?
  3. 如果是,当多线程已经引用单例实例时, 如何确保多线程安全? (我需要添加引用计数吗?)

我想知道如果我需要考虑所有这些,单例模式似乎非常复杂。

#include <mutex>

class Singleton 
{
    static Singleton *singletonInstance;
    Singleton() {}
    static std::mutex m_;

  public:

    static Singleton* getSingletonInstance()
    {
        std::lock_guard<std::mutex> lock(m_);
        if(singletonInstance == nullptr)
        {
            singletonInstance = new Singleton();
        }
        return singletonInstance;
    }
}

最佳答案

您不需要为单例手动管理内存。这是您使用 std::unique_ptr 的示例:

#include <memory>
#include <mutex>

class Singleton 
{
    static std::unique_ptr<Singleton> singletonInstance;
    Singleton() {}
    static std::mutex m_;

  public:

    static Singleton* getSingletonInstance()
    {
        std::lock_guard<std::mutex> lock(m_);
        if (!singletonInstance)
        {
            singletonInstance = std::make_unique<Singleton>();
        }
        return singletonInstance.get();
    }
};

std::unique_ptr 析构函数将在进程正常结束时被调用。此外,无需同步析构函数。

但更好的是,您应该使用 Scott Meyer 的单例:

class Singleton {
public:
    static Singleton& getSingletonInstance() {
        static Singleton instance;
        return &instance;
    }
};

上面的例子是线程安全的,即使没有使用明确的锁。


对于 Q3,即使成员函数 getSingletonInstance 可能是线程安全的,但单例的使用可能不是。共享可变状态本质上是线程不安全的。

关于c++ - 在我的案例中,我是否需要销毁单例实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54748837/

相关文章:

c++ vector operator[] 引用

c++ - std::regex_replace:分离匹配组的访问索引

c++ - 重载后增量运算符

java - 线程安全单例

ios - ObjC 如何在应用程序未退出时处理单例对象

scala - 生成类型类实例时无法证明单例类型是单例类型

c++ - 将 ComboBox 设置为另一个 ComboBox 的 ID

configuration - 用于应用程序配置的单例

haskell - 将存在主义提升到类型层面

haskell - 异构列表中的单例