当前位置: 首页 > news >正文

c++单例模式

一、作用:主要是确保一个类仅有一个实例,并提供一个全局访问点来获取这个实例。常见的有懒汉式和饿汉式。

二、懒汉式(线程不安全):在第一次使用时实例化对象。基本的懒汉式实现并不支持多线程环境,因为在多线程环境下可能会创建多个实例。

#include <iostream>class Singleton
{
private:static Singleton *instance;Singleton() {} // 构造函数私有public:static Singleton *getInstance(){if (instance == nullptr){instance = new Singleton();}return instance;}// 虚析构函数,用于确保子类能够正确释放资源virtual ~Singleton(){delete instance;instance = nullptr;}Singleton(const Singleton &) = delete;Singleton &operator=(const Singleton &) = delete;
};// 静态成员变量需要在类外初始化
Singleton *Singleton::instance = nullptr;int main()
{Singleton *s1 = Singleton::getInstance();Singleton *s2 = Singleton::getInstance();// s1和s2指向同一个实例std::cout << ((s1 == s2) ? "Same instance" : "Different instance") << std::endl;return 0;
}

三、饿汉式:在程序启动时即创建实例,因此不存在多线程访问时创建多个实例的问题。

#include <iostream>class Singleton
{
private:static Singleton instance;Singleton() {} // 构造函数私有public:static Singleton &getInstance(){return instance;}// 虚析构函数,用于确保子类能够正确释放资源virtual ~Singleton(){}Singleton(const Singleton &) = delete;Singleton &operator=(const Singleton &) = delete;
};// 静态成员变量需要在类外初始化
Singleton Singleton::instance;int main()
{Singleton &s1 = Singleton::getInstance();Singleton &s2 = Singleton::getInstance();// s1和s2引用同一个实例std::cout << ((&s1 == &s2) ? "Same instance" : "Different instance") << std::endl;return 0;
}

 饿汉式单例模式由于其实现简单且线程安全(实例在程序启动时被创建),是实际应用中较为常见的选择。

相关文章:

  • 「Conda」在Linux系统中安装Conda环境管理器
  • python安全脚本开发简单思路
  • SpringBoot+Vue实现简单的文件上传(txt篇)
  • 华为USG6000V防火墙v1
  • 【区块链 + 智慧政务】城市公积金中心区块链基础服务平台 | FISCO BCOS应用案例
  • 网络安全工作者如何解决网络拥堵
  • Centos---命令详解 vi 系统服务 网络
  • 【C语言】深入解析选择排序
  • 音视频入门基础:H.264专题(13)——FFmpeg源码中通过SPS属性获取视频色彩格式的实现
  • PyTorch张量创建和随机数生成器算法
  • 【区块链 + 智慧政务】区块链 +ETC 下一代公路联网收费关键技术优化项目 | FISCO BCOS应用案例
  • 去除重复数字
  • 浅聊授权-spring security和oauth2
  • K8S系列-Kubernetes基本概念及Pod、Deployment、Service的使用
  • 新增支持GIS地图、数据模型引擎升级、增强数据分析处理能力
  • (ckeditor+ckfinder用法)Jquery,js获取ckeditor值
  • 【Linux系统编程】快速查找errno错误码信息
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • 78. Subsets
  • echarts花样作死的坑
  • HTTP--网络协议分层,http历史(二)
  • Java 网络编程(2):UDP 的使用
  • LeetCode29.两数相除 JavaScript
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • vue-router 实现分析
  • 基于axios的vue插件,让http请求更简单
  • 蓝海存储开关机注意事项总结
  • 区块链技术特点之去中心化特性
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 一个项目push到多个远程Git仓库
  • 一些关于Rust在2019年的思考
  • 字符串匹配基础上
  • gunicorn工作原理
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • 昨天1024程序员节,我故意写了个死循环~
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​14:00面试,14:06就出来了,问的问题有点变态。。。
  • ​io --- 处理流的核心工具​
  • ​LeetCode解法汇总518. 零钱兑换 II
  • #Datawhale AI夏令营第4期#多模态大模型复盘
  • #if 1...#endif
  • #include<初见C语言之指针(5)>
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (160)时序收敛--->(10)时序收敛十
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (贪心) LeetCode 45. 跳跃游戏 II
  • (一)SvelteKit教程:hello world
  • (一)项目实践-利用Appdesigner制作目标跟踪仿真软件
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能