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

文章目录


前言

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

一.使用atexit释放内存

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

cpp 复制代码
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中,静态变量是线程安全的

cpp 复制代码
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 : public
	Singleton<DesignPattern> {
	friend class Singleton<DesignPattern>; 
private:
	DesignPattern() {}
	~DesignPattern() {}
};
相关推荐
自由随风飘20 小时前
python 题目练习1~5
开发语言·python
Bony-21 小时前
Go语言完全学习指南 - 从基础到精通------语言基础篇
服务器·开发语言·golang
阿巴~阿巴~21 小时前
线程安全单例模式与懒汉线程池的实现与优化
linux·服务器·单例模式·线程池·饿汉模式·懒汉模式·静态方法
不光头强21 小时前
Java中的单例模式
单例模式
崎岖Qiu21 小时前
【设计模式笔记17】:单例模式1-模式分析
java·笔记·单例模式·设计模式
ShineSpark21 小时前
Crashpad 在windows下编译和使用指南
c++·windows
fl1768311 天前
基于python的天气预报系统设计和可视化数据分析源码+报告
开发语言·python·数据分析
ACP广源盛139246256731 天前
(ACP广源盛)GSV6172---MIPI/LVDS 信号转换为 Type-C/DisplayPort 1.4/HDMI 2.0 并集成嵌入式 MCU
c语言·开发语言·单片机·嵌入式硬件·音视频
不穿格子的程序员1 天前
从零开始刷算法-栈-括号匹配
java·开发语言·
雪域迷影1 天前
C#中通过get请求获取api.open-meteo.com网站的天气数据
开发语言·http·c#·get