malloc 碎片整理吐核故障初步解决

mlTp clean(mlTp mmList){
    mlTp mm = mmList->next;  
    mlTp nextm = NULL;  
    while (mm != NULL){  
        nextm = mm->next;  
        del(mm);  
        mm = unite(mm);  
        mmList = add(mmList,mm);  
        mm = nextm;  
    }  
    return  mmList;  
}  


     上面是原来的碎片整理函数. 

    在while{}范围内,nextm指向mm->next,普通情况下,这一切工作得很好(其实这里就很不严谨),当跟mm相邻的碎片刚好是mm->next的时候,mm和他相邻的碎片已经合二为一,并且那一块碎片已经不在链表中,而nextm依然指向该碎片,从而是这块内存被两个节点描述,开始不会有什么问题,当进行多次申请释放之后.链表就是一个完全错误的内存描述,不吐核才更危险.那就可能一块内存分配给了多个申请.后果不堪设想.

    当然这还够不成吐核的条件,由于内存块的描述就在该内存前面相连的,如果将大的那块分配出去了,这就破坏了这块内存的描述,当申请这块内存的时候,就会有机率吐核了.

     问题虽然看上去解决了,不过我还是不放心,因为,我只分配内存进行测试,并没有对分配的内存进行读写,所有破坏的机率不大.这可能只是其中的一个bug.

     下面是修改后的碎片整理程序

    其他函数见malloc实现

mlTp clean(mlTp ml){
    mlTp mm = ml->next;
    mlTp nextm = NULL;
    while(mm != NULL){
        nextm = mm->root;
        del(mm);
        unsigned long size = 0;
        do{
            size = mm->size;
            mm = unite(mm);
        }while(size != mm->size);
        ml = add(ml,mm);
        if(mm != nextm->next)
            mm = nextm->next;
        else
            mm = nextm->next->next;
    }
    return ml;
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值