首页 > 后端开发 > C++ > 正文

C++如何实现单例模式?(代码示例)

尼克
发布: 2025-12-22 13:29:02
原创
297人浏览过
C++11局部静态变量实现单例最推荐——利用其线程安全、延迟初始化特性,代码简洁且无需手动管理内存;饿汉式启动即构造但不支持延迟初始化;手动指针方式需自行处理线程安全与释放。

c++如何实现单例模式?(代码示例)

单例模式确保一个类只有一个实例,并提供全局访问点。C++ 中常用 懒汉式(线程安全)饿汉式 两种实现,现代 C++(C++11 起)推荐用局部静态变量方式——简洁、线程安全、延迟初始化。

✅ 推荐写法:C++11 局部静态变量(最简且安全)

利用 C++11 标准中“函数内局部静态变量的初始化是线程安全的”特性:

class Singleton {
public:
    static Singleton& getInstance() {
        static Singleton instance; // ✅ 延迟初始化 + 线程安全
        return instance;
    }
<pre class='brush:php;toolbar:false;'>Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
登录后复制

private: Singleton() = default; // 私有构造,禁止外部创建 ~Singleton() = default; // 可选:若需自定义析构可设为 public/protected };

使用方式:

int main() {
    auto& s1 = Singleton::getInstance();
    auto& s2 = Singleton::getInstance();
    // s1 和 s2 是同一个对象(地址相同)
    return 0;
}
登录后复制

⚠️ 注意事项:避免常见坑

  • 不要在构造函数里调用 getInstance(),否则导致无限递归或未定义行为
  • 静态局部变量的析构时机由首次调用时的线程决定,但销毁本身是线程安全的(C++11 起)
  • 若单例依赖其他全局对象,注意静态初始化顺序问题;可考虑用指针 + new(手动管理),但需额外处理释放逻辑

? 饿汉式(适合无复杂初始化、要求绝对启动即存在)

全局静态对象,程序启动时即构造,天然线程安全,但不支持延迟初始化:

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

《PHP设计模式指南》中文版
《PHP设计模式指南》中文版

《PHP设计模式》首先介绍了设计模式,讲述了设计模式的使用及重要性,并且详细说明了应用设计模式的场合。接下来,本书通过代码示例介绍了许多设计模式。最后,本书通过全面深入的案例分析说明了如何使用设计模式来计划新的应用程序,如何采用PHP语言编写这些模式,以及如何使用书中介绍的设计模式修正和重构已有的代码块。作者采用专业的、便于使用的格式来介绍相关的概念,自学成才的编程人员与经过更多正规培训的编程人员

《PHP设计模式指南》中文版 341
查看详情 《PHP设计模式指南》中文版
class Singleton {
public:
    static Singleton& getInstance() {
        return instance;
    }
<pre class='brush:php;toolbar:false;'>Singleton(const Singleton&) = delete;
Singleton& operator=(const Singleton&) = delete;
登录后复制

private: Singleton() = default; static Singleton instance; // 全局唯一实例 };

// 定义静态成员(必须在 .cpp 文件中) Singleton Singleton::instance;

? 手动管理指针(兼容老标准,但需谨慎)

适用于需控制销毁时机或 C++98 环境(不推荐新项目使用):

class Singleton {
public:
    static Singleton* getInstance() {
        if (!instance) {
            instance = new Singleton();
        }
        return instance;
    }
<pre class='brush:php;toolbar:false;'>static void destroy() {
    delete instance;
    instance = nullptr;
}
登录后复制

private: Singleton() = default; static Singleton* instance; };

Singleton* Singleton::instance = nullptr;

⚠️ 缺点:需手动调用 destroy(),否则内存泄漏;多线程下 getInstance() 非线程安全(需加锁)。

基本上就这些。C++11 的局部静态变量方案最值得优先采用——不用锁、不担心析构顺序、代码干净、语义清晰。

以上就是C++如何实现单例模式?(代码示例)的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号