C语言小项目实现简易内存池管理

AI助手已提取文章相关产品:

根据本周的学习我们学习了指针,数组指针,函数指针,以及对栈和堆,动态内存分配的了解,今天我们就实战学习和练习尝试做一个:(提示用电脑观看,看着代码和文字感触更深)

简易内存池管理

实现的功能

1.初始化内存池:指定内存池大小,并且分配连续的内存区域
2.从内存池当中分配一块指定大小的内存
3.释放已经分配的内存,将分配的内存还给内存池.
4.内存池销毁,释放整个内存池

设计思路

1..方便管理,每块内存大小size设置64字节.
2.用数组记录每块是否被分配(0表示空闲,1表示已分配).
3.分配时,用指针寻找连续空闲内存块,找到标记已分配并且返回指向的起始地址.
4.释放,将每个已分配的内存块标记为空闲。

设计步骤

1.定义一个结构体,

1.char*类型的起始地址(当然嘛这个类型你们可以自己设置这里是推荐不说为什么了,前面有讲过指针了)2.int类型的内存总块数.3.int类型的每块的字节数4.int*类型的状态,来判断内存块,空闲or已分配.(下面是我的代码仅供参考)

2.初始化内存池函数

1.定义一个结构体指针变量,malloc申请一个堆空间(为一个结构大小)返回类型为结构体指针
2.定义起始地址calloc申请堆空间参数为(1,每块的字节数)第一个嘛
3.定义状态数组calloc申请堆空间参数(总块数,int)这些calloc,malloc,前面博客有所介绍.
4.将我们的结构体变量总块数bolck_nums每块的大小block_size指向我们函数的参数

5.!!!注意申请失败一定要释放空间返回NULL(以下是我的代码仅供参考)

3.初始化分配内存函数

1. 计算需要的块数,因为传参进来的是总字节大小,要除以每块的字节数得到一共要多少块!!!!注意我们这里要向上取整,因为比如我们需要存放65个字节我们一块只有64,所以要用到2块,注意我的表达式就好等下会放到下面代码当中

2.寻找空闲块数,用一共开始的内存块block_start来对应寻找的连续内存块起点.再用count来记录有几个连续的内存块,如果达到我们的要求,需要内存块==count就返回就好,如果不就从新接着找,最惨的情况是没有这么多连续的返回NULL。

3.将函数申请的堆空间标记上已分配用状态数组

4.返回我们的地址return (*viod)比如我们申请3个内存块,表达式就是(起始地址start_addr+起始第几块block_start*每块的大小嘛block_size)(以下代码仅供参考)

4.释放内存

1.因为我们要释放内存,首先第一个参数释放的大小size,

2.因为我们要计算出,从第几块开始释放这个地址的算法,我们要用到分配内存函数的返回值,内存大小字节,这里可以看出类型为char*,也就是拿,我们第几块开始的起始地址-起始地址pool->start_addr / 每块内存的大小pool->block_size

3.释放的块数:第2个算的是要从几个开始释放,这个算的是开始之后要释放多少,就是拿我们想要释放的大小size+pool->block_size-1 / pool->block_size!!!这里说明一下,为什么要加上一个内存大小在减去1因为我们要向上取整,比如我们要释放100个字节你说是要几个内存块1个64字节,2个128字节,128>100>64,但我们释放就要释放2个

4.最后一就是给状赋值为空闲0利用循环

5.销毁内存池

这个很简单就是创建一个函数将状态数组,首地址,内存池全部free

以上就完成了我们简易的c语言内存池

下面呢是我直接测试用的,你们也可以去练习练习,我们一起讨论一起进步

谢谢大家!有什么问题,做得不好的地方可以评论留言我们一起讨论!

您可能感兴趣的与本文相关内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

C Yu小白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值