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;
}