C语言内存池使用模型
作者:网络转载 发布时间:[ 2012/9/29 15:31:32 ] 推荐标签:
六、内存池的释放
在内存池的使命结束后,我们需要释放内存池,不仅仅是struct pool_struct这个结构,还包括链表上的内存块。
void pool_free(pool_t p)
{
struct pfree *cur, *stub;
if(p == NULL) return;
cur = p->cleanup;
while(cur != NULL)
{
(*cur->f)(cur->arg); // 这会释放用malloc分配的内存块和struct pheap结构所占用的内存。这是前文的_pool_heap_free函数
stub = cur->next;
free(cur); // 释放pfree结构。
cur = stub;
}
free(p); //释放pool_struct结构所占用的内存。
}
七、从内存池分配内存
这个才是本文的重点,如何从内存池中分配一个没有被使用的内存,先看代码,表示从内存池中分配size大小的内存,这个机制也是本文的重点。
void *pool_malloc(pool_t p, int size)
{
void *block;
if(p == NULL)
{
fprintf(stderr,"Memory Leak! [pmalloc received NULL pool, unable to track allocation, exiting]
");
abort();
}
if(p->heap == NULL || size > (p->heap->size / 2))
{
while((block = malloc(size)) == NULL) sleep(1);
p->size += size;
_pool_cleanup_append(p, _pool_free(p, _pool__free, block));
return block;
}
if(size >= 4)
while(p->heap->used&7) p->heap->used++; // 这一步是个对齐操作,如果已经使用的不是8的倍数,会跳过,直到为8的倍数。
if(size > (p->heap->size - p->heap->used))
p->heap = _pool_heap(p, p->heap->size);
block = (char *)p->heap->block + p->heap->used;
p->heap->used += size; //已经使用部分增加,也会使得内存分配的偏移值指针增加。
return block;
}
从上面的代码中,可以看出分配内存的策略如下:
1、如果内存池中没有内存或者将要分配的内存比内存池中总的内存数一半还要大,会调用malloc向系统请求内存。并把分配的内存加入到内存池中。
2、已分配的内存按字对齐,如果没有对齐,会跳过不对齐部分,不对齐的部分标识为已经使用。
3、如果链表新的内存块内存剩余的大小不足于分配size字节,会重新请求新的内存块,并加入内存池。
4、从链表的后内存块分配,p->heap->used,表示内存块中已经使用的一个偏移,从这里开始分配。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11