Jabberd2源代码分析:pool
来源:互联网 发布:人工智能 第三版 pdf 编辑:程序博客网 时间:2024/05/18 02:39
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模式下显示一些调试信息
- Jabberd2源代码分析:pool
- Jabberd2源代码分析: JID
- Jabberd2源代码分析:spool
- Jabberd2源代码分析: SX
- Jabberd2源代码分析: MIO
- Jabberd2源代码分析: client连接c2s
- Jabberd2源代码分析:c2s与router SASL验证过程
- Jabberd2源码分析: 客户端BIND
- Jabberd2源码分析: 绑定到router
- 对象池commons-pool框架的研究以及源代码分析(一)
- 对象池commons-pool框架的研究以及源代码分析(二)
- 对象池commons-pool框架的研究以及源代码分析(三)
- 对象池commons-pool框架的研究以及源代码分析(四)
- 对象池commons-pool框架的研究以及源代码分析(五)
- 对象池commons-pool框架的研究以及源代码分析(六)总结
- shared pool 深入分析!
- commons-pool分析
- redigo代码分析-pool
- Qt Webkit可以做什么(二)——显示网页&获取网络服务
- C语言中的bool
- ORACLE中对LONG类型进行处理的方法
- An example code
- 如何禁止调整自定义控件的尺寸?
- Jabberd2源代码分析:pool
- Qt WebKit可以做什么(三)——开发包含丰富web内容的本地应用
- 自己动手编写嵌入式Bootloader之(3)
- 求助:chukwa如何安装
- 如何在Android当中显示网络图片
- Qt webKit可以做什么(四)——实现本地QObject和JavaScript交互
- SVN的搭建和使用
- 1-2岁游戏
- hibernate inverse 的基本用法