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

文章目录


前言

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

一.使用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() {}
};
相关推荐
Envyᥫᩣ5 分钟前
C#语言:从入门到精通
开发语言·c#
童先生26 分钟前
Go 项目中实现类似 Java Shiro 的权限控制中间件?
开发语言·go
lulu_gh_yu27 分钟前
数据结构之排序补充
c语言·开发语言·数据结构·c++·学习·算法·排序算法
Re.不晚1 小时前
Java入门15——抽象类
java·开发语言·学习·算法·intellij-idea
老秦包你会1 小时前
Qt第三课 ----------容器类控件
开发语言·qt
凤枭香1 小时前
Python OpenCV 傅里叶变换
开发语言·图像处理·python·opencv
ULTRA??1 小时前
C加加中的结构化绑定(解包,折叠展开)
开发语言·c++
远望清一色1 小时前
基于MATLAB的实现垃圾分类Matlab源码
开发语言·matlab
confiself1 小时前
大模型系列——LLAMA-O1 复刻代码解读
java·开发语言
凌云行者2 小时前
OpenGL入门005——使用Shader类管理着色器
c++·cmake·opengl