讲师中心 微信公众号
AI工具推荐 视频效率加速

c++中如何实现单例模式_c++单例模式的代码实现步骤【指南】

冬芳君_9277

冬芳君_9277

发布时间:2026-01-20 15:39:30

|

406人浏览过

|

来源于php中文网

原创

单例不能用全局变量代替,因其不满足延迟初始化、全局唯一和线程安全三要素;C++11起推荐用local static实现,简洁且线程安全。

c++中如何实现单例模式_c++单例模式的代码实现步骤【指南】

为什么不能用全局变量代替单例

全局变量在多线程环境下不安全,且无法控制初始化时机——static局部变量在 C++11 起才保证线程安全的首次初始化,而全局对象的构造顺序跨编译单元不可控,容易引发 undefined behavior。单例的核心诉求是「延迟初始化 + 全局唯一 + 线程安全」,这三点全局变量一个都做不到。

最简安全写法:C++11 以后推荐用 local static

利用函数内 static 变量的“首次调用时初始化”和“C++11 标准保证的线程安全”特性,代码极简且无锁:

class Singleton {
public:
    static Singleton& getInstance() {
        static Singleton instance; // ✅ 线程安全,仅首次调用构造
        return instance;
    }

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

private:
    Singleton() = default; // 可加日志或资源初始化
};

注意点:

  • getInstance() 必须返回引用(Singleton&),返回值会触发拷贝,破坏单例语义
  • 构造函数设为 private,防止外部 new 或直接实例化
  • 显式删除拷贝构造与赋值操作符,避免误用
  • 不要在构造函数里调用其他单例的 getInstance(),可能触发静态初始化顺序问题

需要手动管理生命周期?慎用 std::unique_ptr + new

只有在必须延迟析构(比如依赖其他单例销毁后才释放)或需定制销毁逻辑时,才考虑堆分配。但代价是引入显式内存管理风险:

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

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
class Singleton {
public:
    static Singleton& getInstance() {
        static std::unique_ptr<Singleton> instance;
        if (!instance) {
            instance = std::make_unique<Singleton>();
        }
        return *instance;
    }

private:
    Singleton() = default;
    ~Singleton() = default; // 可加清理逻辑
};

隐患:

  • 如果程序异常退出(如 std::abort()),~Singleton() 可能不被调用
  • 多个单例之间若存在析构依赖,仍可能 crash(C++ 不保证静态对象析构顺序)
  • 比 local static 写法多一次指针解引用,性能略低(通常可忽略)

双检锁(DCLP)在 C++ 中已过时且极易出错

早期为兼容 C++03 手写双重检查锁定(Double-Checked Locking Pattern),现在完全没必要。它要求:

  • 用 std::atomic<Singleton*> 存储指针(裸指针 + volatile 在 C++11 后无效)
  • 两次 load() 都需指定内存序(如 memory_order_acquire)
  • 中间 new 操作必须确保构造完成后再发布指针,否则其他线程可能看到未初始化对象

哪怕抄对了,也比 local static 多出锁开销和复杂度。C++11 标准明确支持 local static 的线程安全初始化,这是标准给出的正解。

真正要注意的是:单例不是银弹。它的全局状态、隐式依赖和测试困难性,在大型项目中往往比实现本身更伤人。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

相关专题

更多
全局变量怎么定义
全局变量怎么定义

本专题整合了全局变量相关内容,阅读专题下面的文章了解更多详细内容。

4605

2025.09.18

python 全局变量
python 全局变量

本专题整合了python中全局变量定义相关教程,阅读专题下面的文章了解更多详细内容。

1910

2025.09.18

c++ 全局变量
c++ 全局变量

本专题整合了c++全局变量的使用、定义、作用域等等内容,阅读专题下面的文章了解更多详细内容。

199

2026.03.17

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

4048

2025.08.29

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

764

2025.10.23

c++中volatile关键字的作用
c++中volatile关键字的作用

本专题整合了c++中volatile关键字的相关内容,阅读专题下面的文章了解更多详细内容。

774

2025.10.23

C++ 智能指针与现代内存管理
C++ 智能指针与现代内存管理

深入讲解 C++ 现代内存管理的核心工具——智能指针,涵盖 unique_ptr 独占所有权语义、shared_ptr 引用计数机制与循环引用问题、weak_ptr 弱引用的应用场景、make_unique/make_shared 工厂函数的性能优势、自定义删除器的编写、RAII 资源管理思想的实践,以及从裸指针迁移到智能指针的重构策略,帮助开发者编写安全无泄漏的现代 C++ 代码。

359

2026.04.23

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

5927

2023.07.18

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn