六、内存池的释放
在内存池的使命结束后,我们需要释放内存池,不仅仅是struct pool_struct这个结构,还包括链表上的内存块。
void pool_free(pool_t p) if(p == NULL) return; cur = p->cleanup; |
七、从内存池分配内存
这个才是本文的重点,如何从内存池中分配一个没有被使用的内存,先看代码,表示从内存池中分配size大小的内存,这个机制也是本文的重点。
void *pool_malloc(pool_t p, int size) if(p == NULL) if(p->heap == NULL || size > (p->heap->size / 2)) if(size >= 4) if(size > (p->heap->size - p->heap->used)) block = (char *)p->heap->block + p->heap->used; |
从上面的代码中,可以看出分配内存的策略如下:
1、如果内存池中没有内存或者将要分配的内存比内存池中总的内存数一半还要大,会调用malloc向系统请求内存。并把分配的内存加入到内存池中。
2、已分配的内存按字对齐,如果没有对齐,就会跳过不对齐部分,不对齐的部分标识为已经使用。
3、如果链表最新的内存块内存剩余的大小不足于分配size字节,会重新请求新的内存块,并加入内存池。
4、从链表的最后内存块分配,p->heap->used,表示内存块中已经使用的一个偏移,从这里开始分配。