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

单例模式下的自动内存释放和模板

文章目录

  • 前言
  • 一.使用atexit释放内存
  • 二.使用模板


前言

在单例模式中,由于没有自动调用类的析构机制,导致无法内存释放,本文将介绍两种自动释放的方法

一.使用atexit释放内存

atexit是C++标准库中的一个函数,用于在程序退出时执行一些清理工作。它的工作原理是,当程序正常退出(例如,通过调用exit函数或接收到一个信号)时,atexit会按照注册的顺序执行这些清理工作。

class SingleClass {
public:static SingleClass& GetInstance() {if (instance_ == nullptr) {std::once_flag flag;std::call_once(flag, [&]() {instance_= new SingleClass;atexit([]() {delete instance_;});});}return *instance_;}private:SingleClass() { cout << "create" << endl; };~SingleClass() { cout << "destorted" << endl;};SingleClass& operator=(const SingleClass&) = delete;SingleClass(const SingleClass&) = delete;SingleClass(SingleClass&&) = delete;SingleClass& operator=(SingleClass&&) = delete;static SingleClass* instance_;};
SingleClass* SingleClass::instance_=nullptr ;

二.使用模板

在C++11中,静态变量是线程安全的

template<typename T>
class Singleton {
public:static T & GetInstance() {static T instance; return instance;}
protected:virtual ~Singleton() {}Singleton() {} 
private:Singleton(const Singleton&) = delete; Singleton& operator=(const Singleton&) =delete;Singleton(Singleton&&) = delete;Singleton& operator=(Singleton&&) =delete;
};
class DesignPattern : publicSingleton<DesignPattern> {friend class Singleton<DesignPattern>; 
private:DesignPattern() {}~DesignPattern() {}
};

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【C++初阶】:C++入门篇(一)
  • 计算机网络 —— 物理层
  • 了解Android
  • WPF 中,ControlTemplate 和 DataTemplate 是两种不同类型的模板和区别
  • 网络工程师学习笔记(一)
  • Unity Pro安装教程
  • Debezium系列之:记录一次SQLServer数据库数据不采集,恢复采集造成下游承压的情况,以及相对应的详细解决方案
  • USART————单字节串口的发送和发送接收
  • STM32——I2C和SPI波形分析
  • uniapp中节点信息的使用
  • 使用Dynamic Provision的PV需要Kubernetes集群管理员和用户分别做什么?
  • 3个常用zip压缩包文件打来密码删除方法
  • linux中cd的命令
  • Docker 是什么?
  • 【Linux 驱动】IMX6ULL gpio驱动
  • 【css3】浏览器内核及其兼容性
  • Angular2开发踩坑系列-生产环境编译
  • eclipse的离线汉化
  • Iterator 和 for...of 循环
  • Java基本数据类型之Number
  • React as a UI Runtime(五、列表)
  • React 快速上手 - 07 前端路由 react-router
  • Redux系列x:源码分析
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • Spring-boot 启动时碰到的错误
  • 百度小程序遇到的问题
  • 从重复到重用
  • 设计模式 开闭原则
  • 说说动画卡顿的解决方案
  • 学习HTTP相关知识笔记
  • 追踪解析 FutureTask 源码
  • 《TCP IP 详解卷1:协议》阅读笔记 - 第六章
  • python最赚钱的4个方向,你最心动的是哪个?
  • 如何用纯 CSS 创作一个货车 loader
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #HarmonyOS:基础语法
  • #在 README.md 中生成项目目录结构
  • (31)对象的克隆
  • (4.10~4.16)
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (leetcode学习)236. 二叉树的最近公共祖先
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (二)Eureka服务搭建,服务注册,服务发现
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (十三)Maven插件解析运行机制
  • (一)appium-desktop定位元素原理
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (原)Matlab的svmtrain和svmclassify
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)德国人的记事本
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]