如果在使用如下所示的单例实例后进程终止。 是否存在内存泄漏?
我想知道是否需要考虑所有这些因素,单例模式似乎非常复杂。
#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;
}
}
答案 0 :(得分: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();
}
};
该进程正常结束时,将调用std::unique_ptr
析构函数。另外,也不需要同步析构函数。
但是更好的是,您应该使用Scott Meyer的单例:
class Singleton {
public:
static Singleton& getSingletonInstance() {
static Singleton instance;
return &instance;
}
};
即使没有使用显式锁,以上示例也是线程安全的。
对于Q3,即使成员函数getSingletonInstance
可能是线程安全的,也不能使用单例。共享的可变状态本质上是线程不安全的。