C语言内存池使用模型

发表于:2012-9-29 10:03

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:欣宇的专栏    来源:51Testing软件测试网采编

  六、内存池的释放

  在内存池的使命结束后,我们需要释放内存池,不仅仅是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]\n");
        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,表示内存块中已经使用的一个偏移,从这里开始分配。

44/4<1234
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号