//饿汉模式:即类产生的时候就创建好实例对象,这是一种空间换时间的方式 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; };