在我的情况下,我是否需要销毁单例实例?

Her*_*coa 2 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

Gui*_*cot 6

单个人不需要手动内存管理.这是你的例子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();
    }
};
Run Code Online (Sandbox Code Playgroud)

std::unique_ptr当进程正常结束析构函数会被调用.此外,不需要同步析构函数.

但更好的是,你应该使用Scott Meyer的单身人士:

class Singleton {
public:
    static Singleton& getSingletonInstance() {
        static Singleton instance;
        return &instance;
    }
};
Run Code Online (Sandbox Code Playgroud)

上面的示例是线程安全的,即使没有使用显式锁定.


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