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

C++ 单例 Meyers Singleton(迈耶斯单例)

Meyers' Singleton(迈耶斯单例)是 C++ 中实现单例模式的一种简洁高效的方法,由 C++ 专家 Scott Meyers 提出。其核心原理是利用局部静态变量的初始化特性保证单例的唯一性和线程安全性(C++11 及以后标准)。

1、核心原理

  1. 局部静态变量的初始化特性
    在 C++ 中,函数内的局部静态变量会在第一次调用该函数时初始化,且仅初始化一次。Meyers' Singleton 正是利用这一特性,将单例实例定义为静态成员函数中的局部静态变量,确保实例只被创建一次。

  2. 线程安全性(C++11 及以后)
    C++11 标准规定:局部静态变量的初始化是线程安全的,即多个线程同时首次调用函数时,初始化操作会被正确序列化(只有一个线程执行初始化,其他线程等待),无需额外的同步机制。

2、实现代码

#include <iostream>class Singleton {
private:// 1. 私有构造函数:禁止类外创建对象Singleton() {std::cout << "Singleton 实例创建" << std::endl;}// 2. 禁用拷贝构造和拷贝赋值(避免复制实例)Singleton(const Singleton&) = delete;Singleton& operator=(const Singleton&) = delete;// 3. 禁用移动构造和移动赋值(C++11 及以后)Singleton(Singleton&&) = delete;Singleton& operator=(Singleton&&) = delete;public:// 4. 静态成员函数:返回唯一实例(局部静态变量)static Singleton& getInstance() {static Singleton instance;  // 局部静态变量,首次调用时初始化return instance;}// 示例成员函数void doSomething() {std::cout << "Singleton 执行操作" << std::endl;}
};

3、关键细节解析

  1. 私有构造函数
    构造函数被声明为 private,确保外部无法通过 new 或直接定义对象的方式创建实例,只能通过类提供的接口(getInstance())获取实例。

  2. 禁用拷贝和移动
    通过 = delete 显式禁用拷贝构造函数、拷贝赋值运算符、移动构造函数和移动赋值运算符,防止通过复制或移动现有实例创建新对象,保证唯一性。

  3. 静态成员函数 getInstance()
    这是获取单例实例的唯一接口,其内部定义的局部静态变量 instance 会在第一次调用 getInstance() 时初始化,且后续调用不再重复初始化,确保全局只有一个实例。

  4. 实例的生命周期
    局部静态变量 instance 的生命周期从首次初始化开始,直到程序结束时自动销毁,无需手动管理内存(避免了动态分配导致的内存泄漏风险)。

4、总结

Meyers' Singleton 利用 C++ 局部静态变量的初始化特性,以极简的代码实现了线程安全(C++11+)、自动销毁、全局唯一的单例模式。其核心是通过 getInstance() 函数返回局部静态变量的引用,确保实例在第一次使用时初始化且仅初始化一次,是工业界广泛采用的单例方案。

http://www.wxhsa.cn/company.asp?id=6052

相关文章:

  • EF Core 与 MySQL:查询优化详解
  • 短视频营销运营资深导师张伽赫,东莞绳木传媒创始人
  • 20250913
  • 文件的读取操作
  • 9.13日总结
  • 哇哇哇下雨了!——2025 . 9 . 16
  • 奇思妙想(胡思乱想)
  • AI Compass前沿速览:GPT-5-Codex 、宇树科技世界模型、InfiniteTalk美团数字人、ROMA多智能体框架、混元3D 3.0
  • C++中set与map的自定义排序方法详解
  • id
  • 【汇总】Qt常用模块头文件
  • Advanced Algorithm —— Hashing and Sketching
  • CF2136 Codeforces Round 1046 (Div. 2) 补题
  • 【IEEE出版、EI检索稳定】第四届云计算、大数据应用与软件工程国际学术会议(CBASE 2025)
  • 缺省源
  • 97. 交错字符串
  • MODint(自动取模)
  • BFD实验
  • 2025.9.16——卷1阅读程序1、2
  • 用Context Offloading解决AI Agent上下文污染,提升推理准确性
  • HCIP-BFD
  • MISC相关
  • VRRP实验
  • 在 Windows 10 上安装 FFmpeg 8.0
  • 25/9/15(补)
  • [Paper Reading] DINOv3
  • 25/9/16
  • JavaDay5
  • 揭秘Mobile Me数据挖掘:从WebDAV探测到隐藏文件发现
  • 25/9/14(补)