APACHE学习笔记(三) APR 内存管理
时间:2007-05-11 来源:Givemefive
APACHE 内存管理方式:
第一种:
直接调用APR的内存分配:mytype* myvar = apr_palloc(pool, sizeof(mytype)) ;不需要自己free,APR负责自动在pool上注册free,当pool被free的时候,自动执行free myvar.
第二种:
自己调用malloc分配内存:mytype* myvar = malloc(sizeof(mytype)) ;再注册free到一个pool上面apr_pool_cleanup_register(pool, myvar, free,apr_pool_cleanup_null);然后当这个pool被free的时候,APR会调用free,然后自动释放这个myvar.
第三种:
自己调用malloc分配内存:mytype* myvar = malloc(sizeof(mytype)) ;再注册free到一个pool上面apr_pool_cleanup_register(pool, myvar, free,apr_pool_cleanup_null);然后自己手动free掉myvar.这个时候,为了避免pool被free的时候,APR会调用free,而那片内存已经被free掉了,要调用apr_pool_cleanup_kill取消注册的free.
第四种:
自己调用malloc分配内存:mytype* myvar = malloc(sizeof(mytype)) ;自己调用free.
APACHE 中一些pool的生命周期:
request pool :和HTTP Request的一样.
process pool :和Server的一样.
connection pool :和TCP连接的一样.
APR中的一些数据结构:
数组 :apr_array_header_t
创建的时候有一个初始大小,但数组可以变大.
例子:
/* Allocate an array of type my_type */
apr_array_header_t* arr = apr_array_make(pool, sz, sizeof(my_type));
/* Allocate an uninitialized element on the array*/
my_type* newelt = apr_array_push(arr) ;
/* Now fill in the values of elt */
newelt->foo = abc ;
newelt->bar = "foo" ;
/* Pop the last-in element */
my_type* oldelt = apr_array_pop(arr) ;
/* Iterate over all elements */
for (i = 0; i < arr->nelts; i++)
{
/* A C++ reference is the clearest way to show this */
my_type& elt = arr->elts[i] ;
}
表格:apr_table_t
基于数组的key/value对.(high-level).有初始大小
注:apr_table_merge和apr_table_overlap是对于HTTP头和环境变量操作理想的实现.
哈希表:apr_hash_t
key/value对.(low-level).没有初始大小.
队列:apr_queue_t
环:apr_ring,不是数据结构,而是一堆宏定义.
(bucket和brigade)
处理URL的 :apr_uri_t
第一种:
直接调用APR的内存分配:mytype* myvar = apr_palloc(pool, sizeof(mytype)) ;不需要自己free,APR负责自动在pool上注册free,当pool被free的时候,自动执行free myvar.
第二种:
自己调用malloc分配内存:mytype* myvar = malloc(sizeof(mytype)) ;再注册free到一个pool上面apr_pool_cleanup_register(pool, myvar, free,apr_pool_cleanup_null);然后当这个pool被free的时候,APR会调用free,然后自动释放这个myvar.
第三种:
自己调用malloc分配内存:mytype* myvar = malloc(sizeof(mytype)) ;再注册free到一个pool上面apr_pool_cleanup_register(pool, myvar, free,apr_pool_cleanup_null);然后自己手动free掉myvar.这个时候,为了避免pool被free的时候,APR会调用free,而那片内存已经被free掉了,要调用apr_pool_cleanup_kill取消注册的free.
第四种:
自己调用malloc分配内存:mytype* myvar = malloc(sizeof(mytype)) ;自己调用free.
APACHE 中一些pool的生命周期:
request pool :和HTTP Request的一样.
process pool :和Server的一样.
connection pool :和TCP连接的一样.
APR中的一些数据结构:
数组 :apr_array_header_t
创建的时候有一个初始大小,但数组可以变大.
例子:
/* Allocate an array of type my_type */
apr_array_header_t* arr = apr_array_make(pool, sz, sizeof(my_type));
/* Allocate an uninitialized element on the array*/
my_type* newelt = apr_array_push(arr) ;
/* Now fill in the values of elt */
newelt->foo = abc ;
newelt->bar = "foo" ;
/* Pop the last-in element */
my_type* oldelt = apr_array_pop(arr) ;
/* Iterate over all elements */
for (i = 0; i < arr->nelts; i++)
{
/* A C++ reference is the clearest way to show this */
my_type& elt = arr->elts[i] ;
}
表格:apr_table_t
基于数组的key/value对.(high-level).有初始大小
注:apr_table_merge和apr_table_overlap是对于HTTP头和环境变量操作理想的实现.
哈希表:apr_hash_t
key/value对.(low-level).没有初始大小.
队列:apr_queue_t
环:apr_ring,不是数据结构,而是一堆宏定义.
(bucket和brigade)
处理URL的 :apr_uri_t
相关阅读 更多 +