主题:请教
8856792
[专家分:0] 发布于 2010-09-16 16:52:00
struct apr_allocator_t {
apr_uint32_t max_index;
apr_uint32_t max_free_index;
apr_uint32_t current_free_index;
#if APR_HAS_THREADS
apr_thread_mutex_t *mutex;
#endif /* APR_HAS_THREADS */
apr_pool_t *owner;
apr_memnode_t *free[MAX_INDEX];
};
APR_DECLARE(void) apr_allocator_destroy(apr_allocator_t *allocator)
{
apr_uint32_t index;
apr_memnode_t *node, **ref;
for (index = 0; index < MAX_INDEX; index++) {
ref = &allocator->free[index];
while ((node = *ref) != NULL) {
*ref = node->next;
free(node);
}
}
free(allocator);
}
为什么这么释放内存 ref = &allocator->free[index];?
为什么不node= allocator->free[index];?
if(node!=NULL)
{
free()
};
回复列表 (共4个回复)
沙发
windy0will [专家分:2300] 发布于 2010-09-21 15:25:00
我想楼主可能并没有真正理解 apr_memnode_t *free[MAX_INDEX];这个成员吧?
从楼主给出的代码,我猜测apr_memnode_t至少是这种形式的:
[code=c]
typedef struct apt_memnode_t {
//其他成员
struct apt_memnode_t *next;
} apt_memnode_t ;
[/code]
apr_memnode_t *free[MAX_INDEX];这样定义的free成员可是一个指针数组。可以这样理解:
apr_allocator_t开始 free成员 apr_allocator_t结束部分
↓ ↓ ↓
...| ... (其他成员) free[0] free[1] free[2] free[3] ... free[MAX_INDEX] |...
apt_memnode_t的next ↓ ↓ ↓ ↓ ... ↓
node node node node ... node
apt_memnode_t的next ↓ ↓ ↓ ↓ ... ↓
node node node node ... node
apt_memnode_t的next ↓ ↓ ↓ ↓ ... ↓
node node node node ... node
...
apt_memnode_t的next ↓ ↓ ↓ ↓ ... ↓
node node node node ... node
apt_memnode_t的next ↓ ↓ ↓ ↓ ... ↓
NULL NULL NULL NULL ... NULL
所以再释放apr_allocator_t的空间以前,还要把free成员所指向的空间全部释放。
[code=c]
while ((node = *ref) != NULL)//这个循环就是用来释放free[index]对应的那条链表
{
*ref = node->next;
free(node);
}
/***********************************************************************/
node= allocator->free[index];
if(node!=NULL) //而您这样的话,只释放了free[index],而它所指向对象的next对应的对象并没有释放,这剩下的对象由于有可能没有指针可以访问到它,这样有可能会造成内存泄露。
{
free()
};
[/code]
板凳
淘宝商盟 [专家分:30] 发布于 2010-09-26 13:46:00
寻找中国的最优秀的网商领袖精英
当今世界正经历着全球经济一体化的大潮,中国本土企业也因此面临着前所未有的机遇与挑战。
在这场洗礼中,哪些互联网平台有能力成为世界级的电子商务平台?网商精英要怎样做,才能最终成长为世界级网商精英领袖?
淘宝商盟平台震撼登场,携手淘宝30万商家联盟购物商城。
平台刚刚启动,互联网的网商精英请咨询qq: 908889846
占领市场第一先机,合力打造网商系统!
淘宝商盟官网 www.taobaosm.com
http://blog.sina.com.cn/tbsm8
淘宝商盟奖励制度
3 楼
淘宝商盟 [专家分:30] 发布于 2010-09-26 13:47:00
寻找中国的最优秀的网商领袖精英
当今世界正经历着全球经济一体化的大潮,中国本土企业也因此面临着前所未有的机遇与挑战。
在这场洗礼中,哪些互联网平台有能力成为世界级的电子商务平台?网商精英要怎样做,才能最终成长为世界级网商精英领袖?
淘宝商盟平台震撼登场,携手淘宝30万商家联盟购物商城。
平台刚刚启动,互联网的网商精英请咨询qq: 908889846
占领市场第一先机,合力打造网商系统!
淘宝商盟官网 www.taobaosm.com
http://blog.sina.com.cn/tbsm8
淘宝商盟奖励制度
4 楼
8856792 [专家分:0] 发布于 2010-09-26 23:10:00
楼上可能没有明白我的意思.
struct apr_memnode_t {
apr_memnode_t *next; /**< next memnode */
apr_memnode_t **ref; /**< reference to self */
apr_uint32_t index; /**< size */
apr_uint32_t free_index; /**< how much free */
char *first_avail; /**< pointer to first free memory */
char *endp; /**< pointer to end of free memory */
};
for (index = 0; index < MAX_INDEX; index++) {
ref = &allocator->free[index];
while ((node = *ref) != NULL) {
*ref = node->next;
free(node);
}
}
可以写成
apr_memnode_t *node, *ref;
for (index = 0; index < MAX_INDEX; index++) {
ref = allocator->free[index];
while ((node = ref) != NULL) {
ref = node->next;
free(node);
}
}
这样不是也可以吗?用引用有什么优势呢?
我来回复