C++如何实现单例设计模式?C++最常用的设计模式讲解【架构入门】


C++单例模式最安全写法是C++11起用局部静态变量实现,线程安全且自动管理生命周期;带参数时推荐静态局部变量+工厂函数,避免双重检查锁定陷阱;非必要场景应优先考虑依赖注入或全局对象。

c++如何实现单例设计模式?c++最常用的设计模式讲解【架构入门】

单例模式在C++中核心目标是:确保一个类只有一个实例,并提供全局访问点。它不难写,但容易写错——尤其在多线程、析构顺序和懒加载场景下。

最安全的现代C++写法(C++11起推荐)

利用局部静态变量的“首次调用时初始化”和线程安全特性,代码简洁且天然线程安全:

class Singleton {
public:
    static Singleton& getInstance() {
        static Singleton instance; // C++11保证:首次调用时构造,且线程安全
        return instance;
    }

    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;

private:
    Singleton() = default; // 私有构造,禁止外部创建
    ~Singleton() = default; // 析构可公开或私有,按需决定
};

✅ 优点:无锁、无内存泄漏风险、自动管理生命周期、符合RAII;
❌ 注意:析构时机由程序结束时静态对象销毁顺序决定,若其他静态对象依赖它,可能出问题(称为“静态初始化顺序惨案”)。

带参数的单例(延迟构造 + 参数传递)

如果构造函数需要参数(比如配置路径、日志级别),不能直接用静态局部变量。常用方案是“双重检查锁定 + 智能指针”:

#include <memory>
#include <mutex>

class ConfigurableSingleton {
public:
    static ConfigurableSingleton& getInstance(const std::string& configPath) {
        // 第一次检查(无锁,快速返回)
        if (instance_ != nullptr) {
            return *instance_;
        }

        std::lock_guard<std::mutex> lock(mutex_);
        // 第二次检查(加锁后再次确认)
        if (instance_ == nullptr) {
            instance_ = std::make_unique<ConfigurableSingleton>(configPath);
        }
        return *instance_;
    }

    static void destroy() {
        std::lock_guard<std::mutex> lock(mutex_);
        instance_.reset();
    }

private:
    explicit ConfigurableSingleton(const std::string& path) {
        // 加载配置等耗时操作
    }

    ConfigurableSingleton(const ConfigurableSingleton&) = delete;
    ConfigurableSingleton& operator=(const ConfigurableSingleton&) = delete;

    static std::unique_ptr<ConfigurableSingleton> instance_;
    static std::mutex mutex_;
};

// 定义静态成员
std::unique_ptr<ConfigurableSingleton> ConfigurableSingleton::instance_;
std::mutex ConfigurableSingleton::mutex_;

⚠️ 注意:必须手动调用 destroy() 避免程序退出前未释放资源;若不想手动管理,可改用静态局部变量+工厂函数封装参数(更推荐)。

S-CMS企业建站系统(含APP/小程序)5.0 build20230614 S-CMS企业建站系统(含APP/小程序)5.0 build20250614

闪灵CMS企业建站系统是淄博闪灵网络科技有限公司开发的一款专门为企业建站提供解决方案的产品,前端模板样式主打HTML5模板,以动画效果好、页面流畅、响应式布局为特色,程序主体采用PHP+MYSQL构架,拥有独立自主开发的一整套函数、标签系统,具有极强的可扩展性,设计师可以非常简单的开发出漂亮实用的模板。系统自2015年发布第一个版本以来,至今已积累上万用户群,为上万企业提供最优质的建站方案。

S-CMS企业建站系统(含APP/小程序)5.0 build20230614 0 查看详情 S-CMS企业建站系统(含APP/小程序)5.0 build20230614

常见误写与陷阱

  • 手写 double-checked locking(DCLP)不用 memory_order:C++11前易出错,现在应优先用 std::call_once 或静态局部变量
  • 用 new 分配但忘了 delete:导致内存泄漏;建议统一用 std::unique_ptr 管理
  • 把 getInstance 声明为 const 成员函数:错误!获取实例本身是可变操作(首次构造会修改状态)
  • 在构造函数里调用 getInstance:引发死锁或未定义行为(递归初始化静态变量)

什么情况下不该用单例?

单例不是万能解药。以下情况建议绕开:

  • 只是想共享数据 → 用普通全局变量或命名空间内静态对象更轻量
  • 需要多种配置的多个实例(如多个数据库连接)→ 改用工厂 + 对象池
  • 测试困难(全局状态干扰单元测试)→ 考虑依赖注入(传入接口引用)
  • 模块间强耦合 → 单例会隐式引入依赖,破坏可维护性

基本上就这些。单例本身不复杂,但用得是否恰当,往往暴露架构思考深度。

以上就是C++如何实现单例设计模式?C++最常用的设计模式讲解【架构入门】的详细内容,更多请关注其它相关文章!


# ai  # 懒加载  # 最常用  # 首次  # 建站系统  # 如何实现  # 加载  # 多线程  # 递归  # 无锁  # c++  # 网站建设开票是几个点  # 武安网络推广营销好做吗  # 佛山网站排名优化seo  # 湛江网站建设系统介绍图  # seo关键词排名技术  # 加强网站建设论文题目  # 眉山seo网络推广方案  # seo181  # 单页营销网站优化策略  # 珲春seo优化排名  # 全局变量  # 死锁  # 多个 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: Win10显卡驱动安装失败怎么办 Win10使用DDU彻底卸载驱动【解决】  如何在解析前预检查XML文件的完整性? 比如检查文件大小或特定结束标签  《顺丰同城骑士》查看我的技能方法  手机坏了微信聊天记录怎么导出来 新手机恢复聊天记录技巧  sublime如何配置PHP开发环境_在sublime中运行与调试PHP代码  火狐浏览器如何刷新修复浏览器 火狐浏览器“重置Firefox”功能详解  HTML与J*aScript实现下拉菜单驱动的动态表格:构建交互式维修表单  Python类装饰器动态修改方法时的类型提示:Mypy插件实现精确静态分析  C++二维数组动态分配方法_C++指针与数组内存布局  小红书网页版首页入口 小红书网页版电脑端官方登录链接  大熊猫抓取竹子的“大拇指”其实是什么?蚂蚁庄园课堂今天答案最新11月30日  word邮件合并怎么插入个性化图片_Word邮件合并插入个性化图片方法  《360浏览器》设置摄像头权限方法  苹果11如何更换iCloud账号_苹果11账号切换的具体步骤  J*aScript对象中深度嵌套URL键的查找与更新策略  C++ static关键字作用_C++静态成员变量与静态函数  Yandex世界探索 最新官方免登录入口全知道  CSS过渡与滚动滚动事件结合应用_scroll与transition动画  风神瞳获取全攻略  J*a中为什么强调组合优于继承_组合模式带来的灵活性与可维护性解析  Win11怎么开启HDR_Windows 11显示器画质增强设置  Three.js中动态更换3D模型纹理的教程  Linux如何优化系统启动流程_Linux启动项优化方案  《雷电模拟器》自动点击设置方法  解决Go encoding/json 将JSON大数字解析为浮点数的问题  快手极速版在线体验区 快手极速版网页体验入口  Sublime怎么配置YAML文件格式化_Sublime YAML Formatter插件教程  c++20的指定初始化(Designated Initializers)怎么用_c++ C风格结构体初始化  如何在 WordPress 前端实现内容提交:古腾堡编辑器的替代方案与实践  抖音火山版注销账号抖音会注销吗 抖音火山版与抖音账号注销关系  Go语言中方法与接收器:指针和值类型的调用机制详解  Win10运行窗口在哪里打开 Win10调出运行命令框快捷键【技巧】  手机自动关机是怎么回事?如何修复?手机异常关机的原因排查与修复技巧  三角洲行动2025年9月10日摩斯密码分享  解决jQuery多计算器输入字段冲突的教程  mysql导入sql文件能分批导入吗_mysql分批次导入大sql文件的实用技巧  iSpring三分屏制作教程  J*aScript深度克隆:实现高效、健壮与安全的复杂对象复制  TikTok笔记文字无法编辑如何解决 TikTok笔记文字编辑优化方法  vivo浏览器怎么离线保存网页 vivo浏览器下载完整页面以便无网络时阅读  德邦快递会员怎么开通  PHP utf8_encode 字符编码转换陷阱与解决方案  《我的恋爱逃生攻略》中文名字输入方法  lol小红书怎么|直播|?lol小红书|直播|是什么意思?  微信网页版在线登录 微信网页版在线使用入口  作业帮网页版不用下载入口 在线问老师快速答疑  @Team是什么?揭秘团队含义  win11怎么更改账户类型 Win11标准用户和管理员权限切换【教程】  Final Cut Pro视频加EQ教程  苹果手机聊天记录删除了如何恢复 

 2025-12-16

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.