全网整合营销服务商

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

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

c++怎么实现单例模式_c++设计模式之Singleton实现方法【源码】

单例模式确保类仅有一个实例并提供全局访问点;C++中推荐使用C++11局部静态变量实现,因其线程安全、自动内存管理且代码简洁;其他变体如双检锁、饿汉式等按需选用。

单例模式的核心是:确保一个类只有一个实例,并提供全局访问点。C++ 实现时关键在控制构造、拷贝、赋值,以及线程安全和初始化时机。

基础线程不安全版本(懒汉式)

适用于单线程或明确无并发场景,简单直观:

class Singleton {
private:
    static Singleton* instance;
    Singleton() = default;                    // 私有构造
    Singleton(const Singleton&) = delete;     // 禁用拷贝
    Singleton& operator=(const Singleton&) = delete; // 禁用赋值

public: static Singleton* getInstance() { if (instance == nullptr) { instance = new Singleton(); } return instance; } };

// 静态成员定义 Singleton* Singleton::instance = nullptr;

C++11 起推荐:局部静态变量(最简洁 & 线程安全)

利用 C++11 标准保证的“函数内局部静态变量初始化的线程安全性”,无需锁、无需手动管理内存:

class Singleton {
private:
    Singleton() = default;
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;

public: static Singleton& getInstance() { static Singleton instance; // 延迟初始化 + 线程安全 return instance; } };

✅ 优点:自动生命周期管理(程序结束时析构)、无内存泄漏、无锁开销、代码极简。
⚠️ 注意:析构顺序不可控,若单例依赖其他静态对象,可能引发未定义行为。

需要显式控制析构?用 std::unique_ptr + double-checked locking(较重但可控)

适用于需在特定时机释放资源、或必须兼容老标准(如 C++03)的场景:

#include 
#include 

class Singleton { private: static std::unique_ptr instance; static std::mutex mtx;

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

public: static Singleton& getInstance() { if (instance == nullptr) { std::lock_guard<:mutex> lock(mtx); if (instance == nullptr) { instance = std::make_unique(); } } return *instance; }

// 可选:显式销毁
static void destroy() {
    std::lock_guard lock(mtx);
    instance.reset();
}

};

std::unique_ptr Singleton::instance = nullptr; std::mutex Singleton::mtx;

饿汉式(静态常量初始化)

在程序启动时就创建实例,天然线程安全,但牺牲了延迟加载:

class Singleton {
private:
    static Singleton instance;  // 静态存储期,编译器保证初始化一次
    Singleton() = default;
    Singleton(const Singleton&) = delete;
    Singleton& operator=(const Singleton&) = delete;

public: static Singleton& getInstance() { return instance; } };

// 定义并初始化 Singleton Singleton::instance;

✅ 无竞态、无锁、无动态分配;
❌ 实例总被创建,即使从未调用 getInstance(),且无法控制其相对于其他静态对象的初始化顺序。

基本上就这些。日常开发首选局部静态变量版本——它简洁、安全、符合现代 C++ 惯例。其他变体按需选用,比如嵌入式环境禁用异常/RTTI 时注意 std::make_unique 的可用性,或需跨 DLL 边界时考虑导出符号问题。


# c++  # 延迟加载  # 无锁  # Static  # 常量  # if  # double  # public  # 线程  # 并发  # 对象  # 适用于  # 按需  # 推荐使用  # 可用性  # 只有一个  # 可选  # 时就  # 相对于  # 因其  # 结束时 


相关文章: 北京专业网站制作设计师招聘,北京白云观官方网站?  建站之星如何一键生成手机站?  C#如何使用XPathNavigator高效查询XML  电商平台网站制作流程,电商网站如何制作?  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  官网自助建站平台指南:在线制作、快速建站与模板选择全解析  C++如何将C风格字符串(char*)转换为std::string?(代码示例)  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  如何用wdcp快速搭建高效网站?  宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?  网站网页制作电话怎么打,怎样安装和使用钉钉软件免费打电话?  已有域名能否直接搭建网站?  建站之星代理平台如何选择最佳方案?  上海网站制作开发公司,上海买房比较好的网站有哪些?  微信小程序 input输入框控件详解及实例(多种示例)  如何高效利用亚马逊云主机搭建企业网站?  c# 在ASP.NET Core中管理和取消后台任务  如何快速使用云服务器搭建个人网站?  如何在橙子建站上传落地页?操作指南详解  黑客如何利用漏洞与弱口令入侵网站服务器?  网站制作需要会哪些技术,建立一个网站要花费多少?  湖北网站制作公司有哪些,湖北清能集团官网?  武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?  企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目?  大连 网站制作,大连天途有线官网?  如何快速查询域名建站关键信息?  制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?  网站微信制作软件,如何制作微信链接?  建站之星官网登录失败?如何快速解决?  利用JavaScript实现拖拽改变元素大小  如何用5美元大硬盘VPS安全高效搭建个人网站?  交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?  清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  Python路径拼接规范_跨平台处理说明【指导】  如何在Golang中使用replace替换模块_指定本地或远程路径  如何用虚拟主机快速搭建网站?详细步骤解析  佛山企业网站制作公司有哪些,沟通100网上服务官网?  如何自定义建站之星网站的导航菜单样式?  网站制作企业,网站的banner和导航栏是指什么?  定制建站流程步骤详解:一站式方案设计与开发指南  北京网站制作网页,网站升级改版需要多久?  一键网站制作软件,义乌购一件代发流程?  如何在IIS服务器上快速部署高效网站?  如何快速辨别茅台真假?关键步骤解析  如何快速启动建站代理加盟业务?  如何通过FTP空间快速搭建安全高效网站?  如何在万网主机上快速搭建网站?  如何在香港服务器上快速搭建免备案网站?  如何通过虚拟主机快速搭建个人网站? 

您的项目需求

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