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

文章目录


前言

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

一.使用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() {}
};
相关推荐
倒头就睡的小比特1 天前
算法竞赛C++常用的STL
c++·算法
weilx12341 天前
C++笔记-文件IO-<fcntl.h>
c++
小羊没烦恼!1 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
伞伞悦读1 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
Smileyqp沛沛1 天前
前端?C++ ?较大差异基础罗列
c++·基础·前端转c++
C语言小火车1 天前
C/C++ 为什么需要编译器?
开发语言·c++
旖旎夜光1 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
吞下星星的少年·-·1 天前
C++ 萌新语法入门篇
c++·算法比赛
霍霍的袁1 天前
【C++】map 和 set 的使用 | 从用法到底层
开发语言·c++·学习·visual studio
another heaven1 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法