全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

c++ 单例模式实现 c++设计模式代码实例

单例模式确保类唯一实例并提供全局访问点,C++中常用局部静态变量实现(饿汉模式),线程安全且简洁;推荐禁用拷贝与赋值,优先使用C++11后局部静态初始化特性,避免内存泄漏与并发问题。

单例模式确保一个类只有一个实例,并提供一个全局访问点。在 C++ 中实现单例模式时,关键在于控制构造函数的访问、定义静态实例和提供静态获取方法。以下是几种常见的 C++ 单例实现方式,适用于不同场景。

懒汉模式(线程不安全)

懒汉模式在第一次调用时创建实例,适合启动较慢但不一定使用的场景。

class Singleton {
private:
    static Singleton* instance;
    Singleton() = default;  // 私有构造函数
public:
    static Singleton* getInstance() {
        if (instance == nullptr) {
            instance = new Singleton();
        }
        return instance;
    }
};

// 静态成员初始化 Singleton* Singleton::instance = nullptr;

这种方式简单,但在多线程环境下可能创建多个实例,不推荐用于并发程序。

线程安全的懒汉模式(使用 std::call_once)

利用 std::call_oncestd::once_flag 确保只初始化一次,是推荐的线程安全做法。

#include 

class Singleton { private: static std::once_flag onceFlag; static Singleton instance; Singleton() = default; public: static Singleton getInstance() { std::call_once(onceFlag, []() { instance = new Singleton(); }); return instance; } };

// 静态变量定义 std::once_flag Singleton::onceFlag; Singleton* Singleton::instance = nullptr;

该方式保证多线程下也只创建一次实例,代码清晰且安全。

饿汉模式(线程安全)

在程序启动时就创建实例,天然线程安全,因为没有竞态条件。

class Singleton {
private:
    Singleton() = default;
public:
    static Singleton& getInstance() {
        static Singleton instance;  // 局部静态变量,C++11 起线程安全
        return instance;
    }
};

这是最简洁、最常用的实现方式。局部静态变量在首次访问时初始化,之后直接返回,且 C++11 标准保证其初始化是线程安全的。

带自动释放的单例(防内存泄漏)

为避免手动管理内存,可以加入内部嵌套类或智能指针来自动释放资源。

class Singleton {
private:
    Singleton() = default;
    struct Deleter {
        ~Deleter() {
            if (Singleton::instance != nullptr) {
                delete Singleton::instance;
                Singleton::instance = nullptr;
            }
        }
    };
    static Deleter deleter;
public:
    static Singleton* getInstance() {
        static Singleton inst;
        instance = &inst;
        return instance;
    }
    static Singleton* instance;
};

Singleton* Singleton::instance = nullptr; Singleton::Deleter deleter;

通过析构器自动清理,避免内存泄漏。不过更现代的做法是直接使用局部静态对象,由 C++ 运行时管理生命周期。

基本上就这些常见写法。推荐优先使用局部静态变量版本的饿汉模式,简洁、线程安全、无需手动释放。不复杂但容易忽略细节,比如构造函数私有、拷贝控制等。记得禁用拷贝和赋值:

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


# c++  # 构造函数  # 指针  # 线程  # 多线程  # 并发  # 对象  # 这是  # 首次  # 多个  # 但在  # 适用于  # 几种  # 只有一个  # 时就  # 提供一个 


相关文章: 利用JavaScript实现拖拽改变元素大小  整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?  定制建站策划方案_专业建站与网站建设方案一站式指南  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  高性能网站服务器部署指南:稳定运行与安全配置优化方案  如何快速启动建站代理加盟业务?  ,网页ppt怎么弄成自己的ppt?  免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  制作表格网站有哪些,线上表格怎么弄?  SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?  网站制作说明怎么写,简述网页设计的流程并说明原因?  如何通过服务器快速搭建网站?完整步骤解析  建站168自助建站系统:快速模板定制与SEO优化指南  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  寿县云建站:智能SEO优化与多行业模板快速上线指南  宝塔建站助手安装配置与建站模板使用全流程解析  详解jQuery停止动画——stop()方法的使用  桂林网站制作公司有哪些,桂林马拉松怎么报名?  python的本地网站制作,如何创建本地站点?  如何构建满足综合性能需求的优质建站方案?  网站制作软件免费下载安装,有哪些免费下载的软件网站?  Android滚轮选择时间控件使用详解  c# Task.ConfigureAwait(true) 在什么场景下是必须的  c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗  GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?  建站之星如何助力企业快速打造五合一网站?  北京企业网站设计制作公司,北京铁路集团官方网站?  如何选择高效稳定的ISP建站解决方案?  实现虚拟支付需哪些建站技术支撑?  合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?  移民网站制作流程,怎么看加拿大移民官网?  电商网站制作公司有哪些,1688网是什么意思?  如何快速生成专业多端适配建站电话?  官网自助建站系统:SEO优化+多语言支持,快速搭建专业网站  子杰智能建站系统|零代码开发与AI生成SEO优化指南  如何选择香港主机高效搭建外贸独立站?  建站之星与建站宝盒如何选择最佳方案?  购物网站制作公司有哪些,哪个购物网站比较好?  如何快速搭建高效可靠的建站解决方案?  建站之星24小时客服电话如何获取?  如何在阿里云域名上完成建站全流程?  清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  如何选购建站域名与空间?自助平台全解析  如何快速搭建二级域名独立网站?  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  建站上传速度慢?如何优化加速网站加载效率?  如何通过虚拟主机空间快速建站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。