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模式下显示一些调试信息
阅读(1830) | 评论(0) | 转发(0) |