Her*_*coa 2 c++ singleton singleton-type
如果在我使用如下单例实例后终止进程.是否存在内存泄漏?
我想知道如果我需要考虑所有这些,单身模式似乎非常复杂.
#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)
单个人不需要手动内存管理.这是你的例子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可能是线程安全的,单例的使用也可能不是.共享可变状态本质上是线程不安全的.