单例模式确保类唯一实例并提供全局访问点,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::once_flag 确保只初始化一次,是推荐的线程安全做法。
#includeclass 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小时内与您取得联系。