首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

内存池有关问题,有兴趣说两句

2012-03-08 
内存池问题,有兴趣说两句在网上看了内存池的一些代码,我有个疑问假如原内存池初始化时共malloc出32字节的

内存池问题,有兴趣说两句
在网上看了内存池的一些代码,我有个疑问


假如原内存池初始化时共malloc出32字节的内存,这时候,有一个类在实例化时共需要64字节的空间,所以,池需要向系统再申请32字节的内存,但是,原有的32内存和新申请的32内存是不连续的啊,不是一个Malloc出来的啊,这样子会不会在访问该对象的成员时出现指针异常,或者我本身就理解错了?

同时,求各位大虾,给个相对较简单,并且稳定的内存池代码给我,TKS

[解决办法]

探讨

申请时就应该申请足够的空间。

[解决办法]
探讨

我指的是极其特殊的情况下,内存池当然不会设计得这么小啊


又如:
池中有64大小空闲,块大小为16,第一次分配了16大小出去,然后又被分配了32大小出去,最后只剩下,16大小,当用户再次申请32大小的内存是,这剩下的16大小内存和池新申请的内存能连上吗?作为一个完整32大小内存分配给用户吗?

[解决办法]
一般的内存池的实现原理如下:

一个数组, 各元素指向下面个链表:
链表1: 一系列由 指向 8 字节的堆上内存的指针 组成的链表
链表2: 一系列由 指向 16 字节的堆上内存的指针 组成的链表
链表3: 一系列由 指向 32 字节的堆上内存的指针 组成的链表
链表4: 一系列由 指向 64 字节的堆上内存的指针 组成的链表
链表5: 一系列由 指向 128 字节的堆上内存的指针 组成的链表
链表5: 一系列由 指向 256 字节的堆上内存的指针 组成的链表
开始各链表都是空的

当外部通过此内存池申请N=9 (N<=256)个字节的空间时, 
通过计算式 M = (((((N+7)&(~7))>>3)+1)&(~1))<<3, 
M=16, 所以它会从链表2中查找有没有可用的, 
当前没有, 所以它会向系统申请16个字节大小的内存空间给外部

当外部通过此内存池释放这N个字节的空间时,
通过计算M=16, 所以它会把这块空间加个链表2中

当外部通过此内存池申请N=15 (N<=256)个字节的空间时,
通过计算M=16, 所以它会从链表2中查找有没有可用的,
当前有, 所以它会从链表中取下这个节点, 返回给外部

当外部通过此内存池申请N且N>256个字节的空间时,
直接申请N个字节的空间返回给外部

当外部通过此内存池释放N且N>256个字节的空间时, 
直接释放这块内存给系统


我的博客 中也有一个内存池, 与这个的思路不同,
用那个有个特殊条件: 频繁的申请释放大块内存, 用上面的实现就没有意义了
所以具体问题还要具体分析

热点排行