新闻中心

c++怎么实现单例模式_c++设计模式之Singleton实现方法【源码】

2025-12-12
浏览次数:
返回列表
单例模式确保类仅有一个实例并提供全局访问点;C++中推荐使用C++11局部静态变量实现,因其线程安全、自动内存管理且代码简洁;其他变体如双检锁、饿汉式等按需选用。

c++怎么实现单例模式_c++设计模式之singleton实现方法【源码】

单例模式的核心是:确保一个类只有一个实例,并提供全局访问点。C++ 实现时关键在控制构造、拷贝、赋值,以及线程安全和初始化时机。

基础线程不安全版本(懒汉式)

适用于单线程或明确无并发场景,简单直观:

class Singleton {
private:
    static Singleton* instance;
    Singleton() = default;                    // 私有构造
    Singleton(const Singleton&) = delete;     // 禁用拷贝
    Singleton& operator=(const Singleton&) = delete; // 禁用赋值
<p>public:
static Singleton* getInstance() {
if (instance == nullptr) {
instance = new Singleton();
}
return instance;
}
};</p><p>// 静态成员定义
Singleton* Singleton::instance = nullptr;

C++11 起推荐:局部静态变量(最简洁 & 线程安全)

利用 C++11 标准保证的“函数内局部静态变量初始化的线程安全性”,无需锁、无需手动管理内存:

class Singleton {
private:
    Singleton() = default;
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;
<p>public:
static Singleton& getInstance() {
static Singleton instance;  // 延迟初始化 + 线程安全
return instance;
}
};

✅ 优点:自动生命周期管理(程序结束时析构)、无内存泄漏、无锁开销、代码极简。
⚠️ 注意:析构顺序不可控,若单例依赖其他静态对象,可能引发未定义行为。

需要显式控制析构?用 std::unique_ptr + double-checked locking(较重但可控)

适用于需在特定时机释放资源、或必须兼容老标准(如 C++03)的场景:

立即学习“C++免费学习笔记(深入)”;

微软爱写作 微软爱写作

微软出品的免费英文写作/辅助/批改/评分工具

微软爱写作 130 查看详情 微软爱写作
#include <memory>
#include <mutex>
<p>class Singleton {
private:
static std::unique_ptr<Singleton> instance;
static std::mutex mtx;</p><pre class='brush:php;toolbar:false;'>Singleton() = default;
Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;

public: static Singleton& getInstance() { if (instance == nullptr) { std::lock_guard<:mutex> lock(mtx); if (instance == nullptr) { instance = std::make_unique(); } } return *instance; }

// 可选:显式销毁
static void destroy() {
    std::lock_guard<std::mutex> lock(mtx);
    instance.reset();
}

};

std::unique_ptr Singleton::instance = nullptr; std::mutex Singleton::mtx;

饿汉式(静态常量初始化)

在程序启动时就创建实例,天然线程安全,但牺牲了延迟加载:

class Singleton {
private:
    static Singleton instance;  // 静态存储期,编译器保证初始化一次
    Singleton() = default;
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;
<p>public:
static Singleton& getInstance() {
return instance;
}
};</p><p>// 定义并初始化
Singleton Singleton::instance;

✅ 无竞态、无锁、无动态分配;
❌ 实例总被创建,即使从未调用 getInstance(),且无法控制其相对于其他静态对象的初始化顺序。

基本上就这些。日常开发首选局部静态变量版本——它简洁、安全、符合现代 C++ 惯例。其他变体按需选用,比如嵌入式环境禁用异常/RTTI 时注意 std::make_unique 的可用性,或需跨 DLL 边界时考虑导出符号问题。

以上就是c++++怎么实现单例模式_c++设计模式之Singleton实现方法【源码】的详细内容,更多请关注其它相关文章!


# 面试题  # 网站APP推广广告词  # 宁波seo整站优化软件  # 网站推广图片幼儿园教案  # 灌南seo优化哪家专业  # 学习seo哪里好  # 如何和网站合作建设  # 大连seo公司优选火星  # 深圳网站建设推广报价  # 网站建设弊端有哪些  # 湖北seo排名方案  # 链表  # c++  # 按需  # 如何使用  # 尼克  # 加载  # 适用于  # 递归  # 如何实现  # 微软  # 无锁  # 延迟加载 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: Go语言中Map存储的结构体如何调用指针方法:深入解析与实践  必由学官网入口 必由学教师登录入口  必由学官方登录入口 必由学教师学生账号快速访问  曝R星经典之作开发图 设计简陋但信息密集!  excel怎么制作工资条 excel快速生成工资条的方法  J*aScript中管理异步API调用:确保操作顺序与数据一致性  在WordPress中通过REST API获取BasicAuth保护的远程文章  Lar*el递归关系中排除子孙节点的策略  vivo浏览器自带的下载器速度慢怎么办 vivo浏览器提升文件下载速度的技巧  抖音网页版怎么|直播|_抖音网页版开播操作指南  J*a递归快速排序中静态变量导致数据累积的陷阱与解决方案  冬*霸灯泡不亮怎么办_浴霸取暖灯一盏不亮的灯座清洁修复法  Lar*el如何生成PDF或Excel文件_Lar*el文档导出工具与使用教程  12306选座如何查看座位示意图_12306座位示意图解读与使用  J*aScript数据结构转换:将对象数组按类别分组  火锅吃太多会怎样 火锅吃太多会上火吗  蛙漫安全无毒 官方认证的绿色入口  漫蛙2在线漫画入口 漫蛙正版漫画网页版直达  神庙逃亡小游戏在线玩 神庙逃亡小游戏入口  TikTok网页版直接登录 TikTok网页端官方平台入口  妖精动漫免费平台 妖精动漫官网资源观看网址  知音漫客正版漫画平台_知音漫客官网账号登录  J*aScriptWebpack优化_J*aScript构建工具实战  Golang如何使用bytes.Split分割字节切片_Golang bytes切片分割方法  如何在低配置电脑上搭建轻量级J*a环境_占用更小的环境选择技巧  PHP URL参数传递与500错误调试指南  QQ邮箱官方网站登录入口_QQ邮箱网页版在线使用  如何使用Rector自动化升级旧代码_通过Composer安装和配置Rector进行代码重构  126邮箱网页版官方入口 126邮箱账号在线登录平台  J*aScript实现单选按钮与关联输入框的联动禁用教程  steam官方网页快速访问 steam账号注册全流程  Django通过AJAX异步上传图片并保存至模型的完整指南  知乎APP怎么管理已购盐选内容_知乎APP盐选内容购买记录与查看方法  Python实时数据流中的动态最值查找策略  解决Python logging 中 datefmt 导致时间戳固定不变的问题  深入理解字体排版:Adobe光学字偶距与CSS字偶距的差异与实现  手机屏幕碎了但能正常使用怎么办 手机外屏碎裂的修复建议  探索高级语言到原生C/C++的转译:挑战与内存管理策略  如何使用Node.js csv 包按条件移除含空字段的CSV记录  在J*a中如何使用BigDecimal进行高精度计算_BigDecimal类应用指南  C++如何检测键盘输入_C++ _kbhit与_getch函数非阻塞输入  哔哩哔哩忘记密码了怎么找回_哔哩哔哩密码找回方法  Lar*el Form Request中唯一性验证在更新操作中的正确实现  b站赚钱渠道_b站收益来源  Fabric模组开发:自定义物品与物品组的现代管理方法  没有大陆身份证/银行卡如何实名微信? 亲测有效的几种方法分享  mcjs网页版流畅运行 mcjs低配电脑畅玩入口  邮政快递单号查询入口 邮政快递物流信息在线查询入口  夸克浏览器网页版最新地址 夸克浏览器官方入口合集  Python多线程中正确使用sigwait处理SIGALRM信号 

搜索