C++实现简单内存池

news2024/12/28 17:49:07
/写一个简单的内存池

class Cgirl {
public:
	int bh;//编号
	int xw;//胸围
	
	static char* m_pool; //内存池的初始地址


	//内存池初始化函数、
	static bool initpool() {
		cout << "调用初始化函数\n\n";
		m_pool = (char*)malloc(18);//向堆内存空间申请18字节
		if (m_pool == 0)return false;
		memset(m_pool, 0, 18);//清空这是18个字节
		return true;
	}

	//释放内存池的函数
	static void freePool() {
		if (m_pool == 0)return;
		free(m_pool);
		m_pool = 0;
		cout << "内存池已释放\n\n";
	}

	//重载new函数 重载的new 和 delete默认都是static的
	void* operator new(size_t size) {//参数必须是size_t (unsigned long long ),返回值必须是void*
		
		//分配第一个位置
		if (m_pool[0] == 0) {//判断第一个位置是否可以存0ok  1 not ok
			m_pool[0] = 1;//设置为已用状态
			cout << "分配了第一块内存: "<<(void*)(m_pool+1) << endl<<endl;
			return m_pool + 1;//返回这块内存的起始地址
		}
		//分配第二个位置
		if (m_pool[9] == 0) {
			m_pool[9] = 1;//设置为已用状态
			cout << "分配了第二块内存: " << (void*)(m_pool + 10)<<endl << endl;
			return m_pool + 10;//返回这块内存的起始地址
		}
		//以上两个位置都不可用,直接向内存申请空间
		void* ptr = malloc(size);
		cout << "以上两个位置都不可用,直接向内存申请空间的地址是: " << ptr <<endl<< endl;
		return ptr;
	}
	void operator delete(void* ptr) {
		if (ptr == 0)return;//地址为空直接退出
		if (ptr == m_pool + 1) {
			cout << "释放第一块内存 \n\n";
			m_pool[0] = 0;
			
			return;
		}
		if (ptr == m_pool + 10) 
		{
			cout << "释放第二块内存\n\n";
			m_pool[9] = 0;
		
			return;
		}
		//如果传过来的地址不属于内存池,就还给系统
		free(ptr);
	}



	Cgirl(int bh, int xw) {
		this->bh = bh;
		this->xw = xw;
		cout << "调用了Cgirl(int bh, int xw)构造器...."<<" bh= "<< this->bh<<
			" xw= "<<this->xw<<endl<<endl;
	}
	
	~Cgirl(){
		cout << "调用了析构函数........." << endl<<endl;
	}
};

//初始化内存池指针
char* Cgirl::m_pool = 0;
int main() {
	//初始化内存池
	if (Cgirl::initpool() == false) {
		cout << "初始化内存池失败...." << endl<<endl;
		return -1;
	}
	//使用内存池
	Cgirl* gptr1=new Cgirl(2, 36);//获得第一个对象
	cout << "gptr1地址是: " << gptr1 << " 编号是: " << gptr1->bh << " 胸围是: " << gptr1->xw <<endl<< endl;
	delete gptr1;//销毁

	Cgirl* gptr2 = new Cgirl(3, 37);//获得第一个对象
	cout << "gptr2地址是: " << gptr2 << " 编号是: " << gptr2->bh << " 胸围是: " << gptr2->xw << endl << endl;
	delete gptr2;//销毁

	Cgirl* gptr3 = new Cgirl(4, 38);//获得第一个对象
	cout << "gptr3地址是: " << gptr3 << " 编号是: " << gptr3->bh << " 胸围是: " << gptr3->xw << endl << endl;
	delete gptr3;//销毁

	Cgirl::freePool();//释放内存池


}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/784064.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

100天精通Golang(基础入门篇)——第17天:深入解析Go语言中的指针

&#x1f337; 博主 libin9iOak带您 Go to Golang Language.✨ &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &#x1f30a; 《I…

F#奇妙游(17):F#与真空一维平面大地抛石飞行力学

F#还能干点啥 距离上一次更新已经过去了很久&#xff08;40分钟之久&#xff01;&#xff09;&#xff0c;这段时间我在学习F#&#xff0c;并且在工作&#xff08;划掉&#xff0c;躺肥并没有工作要做&#xff09;中使用F#。 那干点啥呢&#xff1f;还是老本行吧&#xff0c;…

ELK 使用kibana查询和分析nginx日志

背景&#xff1a;使用kibana查询和分析nginx请求日志&#xff0c;方便开发人员查询系统日志和分析系统问题。 setp 1、定义Index patterns 2、定义Discover(Search 查询数据) 3、定义Visualizations 3.1 定义Vertical Bar 3.2 、Choose a source 3.3、定义图表 4、定义…

spring boot中常用的安全框架 Security框架 利用Security框架实现用户登录验证token和用户授权(接口权限控制)

spring boot中常用的安全框架 Security 和 Shiro 框架 Security 两大核心功能 认证 和 授权 重量级 Shiro 轻量级框架 不限于web 开发 在不使用安全框架的时候 一般我们利用过滤器和 aop自己实现 权限验证 用户登录 Security 实现逻辑 输入用户名和密码 提交把提交用户名和…

mysql的存储引擎以及适用场景

目录 mysql的体系结构 存储引擎简介 三种存储引擎的区别 如何选择使用哪种的存储引擎&#xff1f; mysql的体系结构 连接层 最上层是一些客户端的链接服务&#xff0c;主要完成一些类似于连接处理&#xff0c;授权认证&#xff0c;以相关的安全方案。服务器也会为安全接入每…

位运算修行手册

*明明自觉学会了不少知识&#xff0c;可真正开始做题时&#xff0c;却还是出现了“一支笔&#xff0c;一双手&#xff0c;一道力扣&#xff08;Leetcode&#xff09;做一宿”的窘境&#xff1f;你是否也有过这样的经历&#xff0c;题型不算很难&#xff0c;看题解也能弄明白&am…

Spring中事务失效的8中场景

1. 数据库引擎不支持事务 这里以 MySQL为例&#xff0c;MyISAM引擎是不支持事务操作的&#xff0c;一般要支持事务都会使用InnoDB引擎&#xff0c;根据MySQL 的官方文档说明&#xff0c;从MySQL 5.5.5 开始的默认存储引擎是 InnoDB&#xff0c;之前默认的都是 MyISAM&#xff…

【node】使用express+gitee搭建图床,并解决防盗链问题

首先创建一个gitee的项目&#xff0c;详细步骤我就不一一说明 注解&#xff1a;大家记得将这个项目开源&#xff0c;还有记得获取自己的私钥&#xff0c;私钥操作如下&#xff1a; node依赖下载&#xff1a; "axios": "cors": "express"…

FPGA设计时序分析一、时序路径

目录 一、前言 二、时序路径 2.1 时序路径构成 2.2 时序路径分类 2.3 数据捕获 2.4 Fast corner/Slow corner 2.5 Vivado时序报告 三、参考资料 一、前言 时序路径字面容易简单地理解为时钟路径&#xff0c;事实时钟存在的意义是为了数据的处理、传输&#xff0c;因此严…

记一次简单的MySql注入试验

试验环境&#xff1a; 1.已经搭建好的php服务器&#xff0c;并可以通过访问到localhost/index.php&#xff1b; 2.已经安装好数据库&#xff0c;并创建表test&#xff0c;表内有name、age等字段&#xff0c;并随便创建几个假数据用于测试&#xff1b;如图&#xff1a; 开始测…

docker 禅道 远程链接 MySQL

主要的坑在下边 红色字体&#xff1a;认真看 第一种方法 搜索镜像 docker search zentao 拉取镜像 docker pull easysoft/zentao:latest 启动容器 –name [容器名] 设置容器名称 -p [主机端口]:80 绑定端口 -v /home/zentao/zentaopms:/www/zentaopms 挂载数据目录 /h…

idea中Easy Code模版配置

首先找到模版位置 找到使用的模版&#xff0c;我用的是MybatisPlus-H,这是我新建的一个模版 controller.java.vm模版 ##导入宏定义 $!{define.vm}##设置表后缀&#xff08;宏定义&#xff09; #setTableSuffix("Controller")##保存文件&#xff08;宏定义&#xff…

PHP8知识详解:PHP8开发工具VS Code的安装

作为PHP8的开发工具有很多&#xff0c;具有IDE功能的有phpstorm、Visual Studio Code、Sublime Text、NetBeans、Eclipse、Codelobster、PHP Designer等&#xff0c;当然还有很多轻量的工具&#xff0c;比如Notepad、Editplus等。本文给你介绍的是万能编辑器Visual Studio Code…

Python基于PyTorch实现循环神经网络回归模型(LSTM回归算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 LSTM网络是目前更加通用的循环神经网络结构&#xff0c;全称为Long Short-Term Memory&#xff0c;翻…

计算机视觉(二)图像特征提取

文章目录 颜色特征量化颜色直方图适用颜色空间&#xff1a;RGB、HSV等颜色空间操作 几何特征边缘 Edge边缘定义边缘提取 基于关键点的特征描述子引入几何特征&#xff1a;关键点几何特征&#xff1a;Harris角点FAST角点检测几何特征&#xff1a;斑点局部特征&#xff1a;SIFT预…

GPT-4 模型详细教程

GPT-4&#xff08;Generative Pretrained Transformer 4&#xff09;是 OpenAI 的最新语言生成模型&#xff0c;其在各类文本生成任务中表现优秀&#xff0c;深受开发者和研究者喜爱。这篇教程将帮助你理解 GPT-4 的基本概念&#xff0c;并向你展示如何使用它来生成文本。 什么…

前端vue入门(纯代码)35_导航守卫

星光不问赶路人&#xff0c;时光不负有心人 【33.Vue Router--导航守卫】 导航守卫 正如其名&#xff0c;vue-router 提供的导航守卫主要用来通过跳转或取消的方式守卫导航。有多种机会植入路由导航过程中&#xff1a;全局的, 单个路由独享的, 或者组件级的。 记住参数或查…

uniapp JS文件里面调用自定义组件(不用每个页面在template中加组件标签)

前言 工具&#xff1a;uniapp 开发端&#xff1a;微信小程序 其他&#xff1a;uview 2.0 场景&#xff1a;路由器里面&#xff0c;统一验证是否已登录&#xff0c;如果没登录&#xff0c;则直接弹出登录弹窗出来&#xff0c;不管哪个页面都如此。 效果如下&#xff1a; 直接上…

【笔试强训选择题】Day29.习题(错题)解析

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;笔试强训选择题 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01;&#xff…