回 帖 发 新 帖 刷新版面

主题:请教

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个回复)

沙发

我想楼主可能并没有真正理解 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万商家联盟购物商城。
平台刚刚启动,互联网的网商精英请咨询qq: 908889846 
占领市场第一先机,合力打造网商系统!
淘宝商盟官网   www.taobaosm.com
 http://blog.sina.com.cn/tbsm8
淘宝商盟奖励制度

3 楼

寻找中国的最优秀的网商领袖精英  
当今世界正经历着全球经济一体化的大潮,中国本土企业也因此面临着前所未有的机遇与挑战。
在这场洗礼中,哪些互联网平台有能力成为世界级的电子商务平台?网商精英要怎样做,才能最终成长为世界级网商精英领袖?
淘宝商盟平台震撼登场,携手淘宝30万商家联盟购物商城。
平台刚刚启动,互联网的网商精英请咨询qq: 908889846 
占领市场第一先机,合力打造网商系统!
淘宝商盟官网   www.taobaosm.com
 http://blog.sina.com.cn/tbsm8
淘宝商盟奖励制度

4 楼


楼上可能没有明白我的意思.
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);


        }


    }

这样不是也可以吗?用引用有什么优势呢?







我来回复

您尚未登录,请登录后再回复。点此登录或注册