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

文章目录


前言

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

一.使用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() {}
};
相关推荐
学不思则罔12 小时前
ParallelStream并发陷阱解析
java·开发语言·windows
认真的小羽❅12 小时前
【Java并发编程】volatile关键字深度解析:从内存语义到实际应用
java·开发语言
jayson.h12 小时前
可视化界面
开发语言·python
kgduu12 小时前
python中的魔法方法
开发语言·python
计算机安禾13 小时前
【c++面向对象编程】第21篇:运算符重载基础:语法、规则与不可重载的运算符
java·前端·c++
fox_lht13 小时前
12.3.使用生命周期使引用一直有用
开发语言·后端·rust
开发者联盟league13 小时前
在cursor中配置c/c++开发环境
c语言·开发语言·c++
初圣魔门首席弟子13 小时前
bug 2026.05.15(以前能运行的java springboot项目突然间不能运行后台数据了)
java·开发语言·bug
求知也求真佳13 小时前
S19|MCP 与插件:多 Agent 平台 —— 外部能力总线,让外部工具安全接入
开发语言·agent
澈20713 小时前
平衡二叉树:AVL与红黑树终极对比
数据结构·c++·红黑树