pool.c文件分析:
当程序里有大量的频繁的动态分配内存的情况,如果每次分配后都要记得释放该内存,往往会因为各种原因没有释放,从而导致内存泄露,pool提供了这样的机制,不需要为每次分配的内存都要调用释放内存函数,而是在某一时刻集中释放所有动态分配的内存,这种机制的好处是:1,增强了代码的可读性,方便程序编写,不需要一个malloc函数必须对应一个free函数;2,有效的避免了内存泄露的发生。 pool.h文件中提供的接口: 使用到的结构体: struct pheap 用于保存单次分配的内存 struct pfree typedef struct pool_struct pool_t pool_new(char *file, int line); 分配一个空的pool_t, 无需判断返回的指针是否是NULL,pool_new会保证分配成功 struct pfree *_pool_free(pool_t p, pool_cleanup_t f, void *arg) 为struct pheap设置一个清理函数 void _pool_heap_free(void *arg) 释放pheap->block的内存以及pheap自身内存,_pool_free函数传入的第二个参数就是这个函数 void _pool_cleanup_append(pool_t p, struct pfree *pf) 将pf增加到p->cleanup链表末尾 struct pheap *_pool_heap(pool_t p, int size); 分配size大小的pheap,并使用_pool_free设置_pool_heap_free为pheap清理函数,并且将清理函数增加到p->cleanup的末尾 pool_t pool_new_heap(int size, char *file, int line); 创建一个pool_t,并且调用_pool_heap分配size大小的pheap,以及设置相应的清理函数 void *pmalloc(pool_t p, int size) 使用pmalloc函数替代malloc函数分配内存 void *pmalloc_x(pool_t p, int size, char c) 和pmalloc函数类似,但可以在分配成功后对已经分配的内存进行初始化为c void *pmalloco(pool_t p, int size) 分配size大小内存,并且将内存初始化为0 char *pstrdup(pool_t p, const char *src) pstrdup类似strdup函数,区别在于内存是在pool种分配 char *pstrdupx(pool_t p, const char *src, int len) 和pstrdup类似,区别在于生成新字符串的大小不是取决于src大小,而是使用拷贝指定长度len的数据 int pool_size(pool_t p) 返回pool目前所分配内存的大小 void pool_free(pool_t p) 释放所有动态分配的内存,使用pmalloc pstrdup函数分配的内存,集中在这里释放 void pool_cleanup(pool_t p, pool_cleanup_t f, void *arg 有些内存不是通过pool分配的也可以使用pool_cleanup注册后,当pool_free时,集中释放 void pool_stat(int full) 在DEBUG模式下显示一些调试信息