找回密码
 立即注册
首页 业界区 业界 c++单例模式总结

c++单例模式总结

遑盲 2025-6-9 02:18:21
分类

懒汉式:实例对象在第一次被使用时才进行初始化。
饿汉式:实例在定义时就被初始化。
特点

1、构造函数和析构函数私有化,不允许外部创建实例对象。
2、拷贝构造函数和复制运算符重载被delete,不允许产生新的实例。
3、内部定义一个私有的静态数据成员,该成员为本类的实例化对象。
4、提供公有静态成员方法获取该静态对象。
懒汉式

单线程懒汉式实现
  1. 1 class Singleton
  2. 2 {
  3. 3 public:
  4. 4     static Singleton* Ins()
  5. 5     {
  6. 6         if (_ins == nullptr)
  7. 7             _ins = new Singleton();
  8. 8         return _ins;
  9. 9     }
  10. 10
  11. 11 protected:
  12. 12     Singleton() {}
  13. 13     ~Singleton() {}
  14. 14     Singleton(const Singleton&) = delete;
  15. 15     Singleton& operator=(const Singleton&) = delete;
  16. 16
  17. 17 private:
  18. 18     static Singleton* _ins;
  19. 19 };
复制代码
缺陷:

  • 非线程安全:假设目前有2个线程同时访问Singleton::Ins方法,线程A在if条件判断为真后,失去时间片,此时_ins还未初始化。线程B访问Singleton::Ins,由于在A线程中还未初始化_ins,导致B线程创建对象并将_ins初始化完成。此时,时间片再次回到A线程,还原现场,上一个时间片中已经判断过if条件,_ins将调用new创建新对象实例,导致对象被创建两次,内存泄漏。
  • 内存泄漏:在类中,我们只负责new了一个对象,并未对其delete,导致内存泄漏。
下面将用双重锁+智能指针解决上面缺陷。
双重锁+智能指针实现

[code] 1 class Singleton 2 { 3 public: 4     ~Singleton() { std::cout
您需要登录后才可以回帖 登录 | 立即注册