//饿汉模式:即类产生的时候就创建好实例对象,这是一种空间换时间的方式
class CSingleton
{
public:
~CSingleton() {};
CSingleton(const CSingleton&);
CSingleton& operator=(const CSingleton&);
static CSingleton& GetInstance()
{
return instance;
}
private:
CSingleton() {};
static CSingleton instance;
};
//懒汉模式:即在需要的时候,才创建对象,这是一种时间换空间的方式
class CSingleton
{
public:
~CSingleton(){};
CSingleton(const CSingleton&);
CSingleton& operator=(const CSingleton&);
static CSingleton& GetInstance()
{
static CSingleton instance;
return instance;
}
private:
CSingleton(){};
};
//双层锁的方式
class CSingleton
{
public:
~CSingleton() {};
static CSingleton* GetInstance()
{
if (m_pInstance == nullptr)
{
std::lock_guard<std::mutex> lck(m_mutex);
if (m_pInstance == nullptr)
{
m_pInstance = new CSingleton; //内存存在泄漏,可替换智能指针方式
}
return m_pInstance;
}
}
private:
CSingleton() {};
static CSingleton* m_pInstance;
static std::mutex m_mutex;
};
//智能指针方式
class CSingleton
{
public:
~CSingleton() {}; //注意智能指针shared_ptr无法访问私有化的析构函数,若析构函数定义为private,则在单例类内部再定义一个静态的Destory函数,在定义share_ptr的时候指定删除器为destroy
static std::shared_ptr<CSingleton> GetInstance()
{
if (m_pInstance == nullptr)
{
std::lock_guard<std::mutex> lck(m_mutex);
if (m_pInstance == nullptr)
{
m_pInstance = std::shared_ptr<CSingleton>(new CSingleton);
}
return m_pInstance;
}
}
private:
CSingleton() {};
static std::shared_ptr<CSingleton> m_pInstance;
static std::mutex m_mutex;
};