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

文章目录


前言

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

一.使用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() {}
};
相关推荐
小小测试开发7 小时前
安装 Python 3.10+
开发语言·人工智能·python
好评1248 小时前
【C++】智能指针全解
c++·智能指针
AAA大运重卡何师傅(专跑国道)9 小时前
【无标题】
开发语言·c#
是阿建吖!9 小时前
【Linux】信号
android·linux·c语言·c++
城北徐宫9 小时前
Linux信号深度解剖:5种产生、3张表、4次切换
linux·c++·学习
liulilittle9 小时前
论 Linux 内核态全局稳态带宽的卡尔曼估计与工程实现
linux·服务器·网络·c++·计算机网络·tcp·通信
XBodhi.9 小时前
Visual Studio C++ 语法错误: 缺少“;”(在“return”的前面)
开发语言·c++·visual studio
LSssT.9 小时前
【01】Python 机器学习
开发语言·python
l1t10 小时前
DeepSeek总结的使用实体-组件-系统和基于存在性处理进行Python编程39-40
开发语言·python
曾阿伦10 小时前
Python 搭建简易HTTP服务
开发语言·python·http