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
微信
支付宝