Block Coalescing
1 / 6
[100 free][200 used][100 free][100 free]
malloc(250) fails!
Total free: 300, but fragmented.
External fragmentation = gaps between blocks.
Before: [A free][B free][C free]
After: [ABC free - one big block]
next = (char*)block + sizeof(hdr) + block->size;
if (next->free) {
block->size += sizeof(hdr) + next->size;
block->next = next->next;
}
Options:
void free_coalesce(void *ptr) {
block->free = 1;
coalesce_next(block);
coalesce_prev(block);
}
Now malloc(250) succeeds!