已分配块之需要头部,不需要脚部,带来的改变是合并时候,无法轻易的判断prevBlock 是否是一个空闲块,需要从heap_listp开始往后开始寻找到 当前块bp的上一个,判断其头部(因为你无法知道上一个到底是空闲的还是已分配的),来决定是否合并它。
代码思想如下:
static void* newCoaleace(void *bp){
//对于下一个块的合并与原来一样,不再赘述。只考虑前一个块的合并问题
char * tempBp = NEXTBLCK(heap_listp);
//bp是heap_listp后的第一个块,无须合并前一个,直接返回。
if(tempBp ==(char*)bp)
return bp;
//找到bp的前一个块
while(NEXTBLCK(tempBp)!=(char*)bp){
tempBp = NEXTBLCK(tempBp);
}
size_t prevAlloc = GETALLOC(HDRP(tempBp));
//剩下的合并操作类似于书中介绍。
}