遑盲 发表于 2025-6-9 02:18:21

c++单例模式总结

分类

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

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

单线程懒汉式实现

1 class Singleton
2 {
3 public:
4   static Singleton* Ins()
5   {
6         if (_ins == nullptr)
7             _ins = new Singleton();
8         return _ins;
9   }
10
11 protected:
12   Singleton() {}
13   ~Singleton() {}
14   Singleton(const Singleton&) = delete;
15   Singleton& operator=(const Singleton&) = delete;
16
17 private:
18   static Singleton* _ins;
19 };缺陷:

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

1 class Singleton 2 { 3 public: 4   ~Singleton() { std::cout
页: [1]
查看完整版本: c++单例模式总结