当前位置: 首页 > news >正文

C++实现对象单例模式

在 C++ 中实现单例模式有多种方法,以下是线程安全的现代 C++ 实现方式(推荐 C++11 及以上版本):

1. Meyers’ Singleton(推荐)

class Singleton {
public:
    // 删除拷贝构造和赋值运算符
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;

    static Singleton& getInstance() {
        static Singleton instance;  // C++11 保证静态局部变量线程安全
        return instance;
    }

private:
    Singleton() = default;          // 私有构造函数
    ~Singleton() = default;        // 私有析构函数
};

2. 传统线程安全实现(双重检查锁定)

#include <mutex>

class Singleton {
public:
    static Singleton* getInstance() {
        if (instance == nullptr) {
            std::lock_guard<std::mutex> lock(mutex_);
            if (instance == nullptr) {
                instance = new Singleton();
            }
        }
        return instance;
    }

    // 删除拷贝构造和赋值运算符
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;

private:
    Singleton() = default;
    ~Singleton() = default;

    static Singleton* instance;
    static std::mutex mutex_;
};

// 初始化静态成员
Singleton* Singleton::instance = nullptr;
std::mutex Singleton::mutex_;

3. 饿汉式(程序启动时初始化)

class Singleton {
public:
    static Singleton& getInstance() {
        return instance;
    }

    // 删除拷贝构造和赋值运算符
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;

private:
    Singleton() = default;
    ~Singleton() = default;

    static Singleton instance;
};

// 在源文件中初始化
Singleton Singleton::instance;

4.关键要素

  1. 私有构造函数:防止外部创建实例
  2. 删除拷贝构造和赋值运算符:防止对象复制
  3. 静态访问方法:全局访问点(getInstance
  4. 静态实例指针/引用:保存唯一实例
  5. 线程安全:使用互斥锁或 C++11 的线程安全静态局部变量

5.使用方式

Singleton& instance = Singleton::getInstance();

6.注意事项

(1)推荐使用 Meyers’ Singleton(方法1),因为:

  • 自动线程安全(C++11 标准保证)
  • 自动内存管理(无需手动释放)
  • 延迟初始化(首次调用时创建)

如果需要继承或更复杂控制,可以考虑智能指针实现

在程序结束时,静态实例会由系统自动销毁

避免在单例析构函数中引用其他可能已被销毁的单例

(1)这两种实现都满足单例模式的三个核心要求:

  1. 保证唯一实例
  2. 提供全局访问点
  3. 防止外部实例化

相关文章:

  • SQL操作之:连接(JOIN)
  • JavaScript DOM 节点操作
  • 极限编程(XP)简介及其价值观与最佳实践
  • VMware虚拟机卡顿、CPU利用率低、编译Linux内核慢,问题解决与实验对比
  • 【案例91】记一次高级版升级环境报错“fail to save VO Array”
  • 批处理脚本的主要解析规则
  • 正确安装PyTorch
  • WebSocket通信协议
  • OpenCV引擎:驱动实时应用开发的科技狂飙
  • leecode第19天
  • 使用YoloV5和Mediapipe实现——上课玩手机检测(附完整源码)
  • 使用 PyTorch 的 `torch.rot90` 进行张量旋转:数据增强的利器
  • 用matlab搭建一个简单的图像分类网络
  • OpenCV 图形API(14)用于执行矩阵(或图像)与一个标量值的逐元素乘法操作函数mulC()
  • Nyquist内置函数-概述
  • Spring Task 定时任务
  • 呼叫中心系统压力测试文档
  • C++模板元编程与表达式模板技术深度解析:从原理到Eigen实战
  • Pysides6 Python3.10 Qt 画一个时钟
  • zotero配合本地deepseek使用(翻译、辅助阅读)