C++如何实现单例模式的饿汉式与懒汉式_C++经典设计模式对比【总结】-C++

饿汉式单例在程序启动时即初始化,线程安全但可能浪费资源;懒汉式延迟初始化节省资源,但需用双重检查锁定或std::call_once保障线程安全,且析构和内存泄漏风险更高。

饿汉式单例:启动时就构造,线程安全但可能浪费资源

饿汉式在程序加载时就完成实例初始化,天然线程安全,不用加锁。但它的问题是:哪怕你整个程序一次都没调用 getInstance(),构造函数也会执行,如果构造开销大(比如读配置、连数据库),就白耗资源。

实操建议:

  • 把静态成员变量直接定义在类外,或用静态局部变量(C++11 起保证首次调用时初始化且线程安全)
  • 构造函数设为 private,禁止外部 new;拷贝/移动构造和赋值全删掉(= delete)
  • 返回引用比返回指针更常见,避免裸指针生命周期困惑

示例关键片段:

class Singleton {
private:
    Singleton() { /* heavy init */ }
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;
public:
    static Singleton& getInstance() {
        static Singleton instance; // C++11 线程安全的局部静态
        return instance;
    }
};

懒汉式单例:第一次调用才创建,需手动处理线程安全

懒汉式延迟初始化,节省资源,但多线程环境下极易出错——两个线程同时判断 instance == nullptr 为真,接着都执行 new,结果构造两次,返回不同对象。

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

常见错误现象:

  • 没加锁,多线程下出现多个实例(getInstance() 返回地址不一致)
  • 只对 new 加锁,但没对判空加锁,仍可能重复构造
  • 用 std::call_once + std::once_flag 是更简洁安全的选择(C++11)

推荐写法(双重检查锁定 DCLP,注意必须用 volatile 或原子指针防重排序,C++11 后推荐用 std::atomic):

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » C++如何实现单例模式的饿汉式与懒汉式_C++经典设计模式对比【总结】-C++
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4002038+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4002038+
  • 本周更新: 0+
  • 最后更新: 2026-03-16