首先单例要实现几个基本要求:
1.全局只有一个实例:采用static特性可以实现。同时禁止用户自己声明并定义实例:把构造函数设为private。
2.禁止复制和拷贝:拷贝构造函数和重载赋值函数不允许使用。
3.线程安全的
4.用户通过接口获取实例:使用static类成员函数
/* ************有缺陷的懒汉式************** 1.线程安全问题,没有互斥 2.内存泄漏 没有没有调用析构函数。 ************* *************/ class Singleton1{ private: static Singleton1 *m_instance; Singleton1() { cout << "Singleton1_construct" << endl; } public: ~Singleton1(){ cout << "Singleton1_deconstruct" << endl; } Singleton1(Singleton1 &) = delete; Singleton1& operator = (const Singleton1 &) = delete; static Singleton1 * getInstance(){ //这个调用方法也用static,因为static才可以访问static数据成员 if(m_instance == nullptr){ m_instance = new Singleton1(); } return m_instance; } }; /* ************线程安全、内存安全的懒汉式************** 1.要求用户使用智能指针的约束 2.内存泄漏 没有没有调用析构函数。 ************************************************/ #include <memory>//智能指针 #include <mutex> // mutex class Singleton2{ public: typedef shared_ptr<Singleton2> PTR; private: Singleton2(){ cout<< "Singleton2_construct" << endl; } static PTR m_instance; static mutex m_mutex; public: ~Singleton2(){ cout << "Singleton2_deconstruct" << endl; } Singleton2(Singleton2 &) = delete; Singleton2 &operator = (const Singleton2 &) = delete; static PTR getInstance(){ if(m_instance == nullptr){ lock_guard<mutex> lk(mutex); if(m_instance == nullptr) m_instance = shared_ptr<Singleton2> (new Singleton2); } return m_instance; } }; /* ************最推荐的的懒汉式************** 局部静态变量实现线程安全以及 防止内存泄漏 注意:getInstance 返回引用,并且m_instance不是指帧 *****************************************/ class Singleton3{ private: Singleton3(){ cout<< "Singleton3_construct" << endl; } public: ~Singleton3(){ cout<< "Singleton3_deconstruct" << endl; } Singleton3(Singleton3 &) = delete; Singleton3 &operator=(Singleton3 &) = delete; static Singleton3 &getInstance(){ //返回引用 static Singleton3 m_instance; //这里不能是指针 return m_instance; } };本文参考https://www.cnblogs.com/sunchaothu/p/10389842.html#231-crtp-%E5%A5%87%E5%BC%82%E9%80%92%E5%BD%92%E6%A8%A1%E6%9D%BF%E6%A8%A1%E5%BC%8F%E5%AE%9E%E7%8E%B0
