Jabberd2源代码分析:pool

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模式下显示一些调试信息

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值