根据本周的学习我们学习了指针,数组指针,函数指针,以及对栈和堆,动态内存分配的了解,今天我们就实战学习和练习尝试做一个:(提示用电脑观看,看着代码和文字感触更深)
简易内存池管理
实现的功能
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语言内存池
下面呢是我直接测试用的,你们也可以去练习练习,我们一起讨论一起进步


422


被折叠的 条评论
为什么被折叠?



