실습 환경 : Ubuntu 16.04
실습코드
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char* a=(char*)malloc(0x80);
char* b=(char*)malloc(0x400);
char* c=(char*)malloc(0x40);
char* d=(char*)malloc(0x3e0);
free(a);
char* e=(char*)malloc(0x500);
free(d);
char* f=(char*)malloc(0x500);
return 0;
}
a는 fast chunk 사이즈 큰 청크중 가장 작은 사이즈이고, d는 small bin 중 제일 큰 청크가 될 것입니다. 또한 일부러 보기쉽게 인접하지 않게 free를 했습니다. return 0 바로 위 라인 (char* f 부분)이 실행된 직후의 메모리 상황을 살펴보겠습니다.
small_bins[8]에 fast chunk size 보다 큰 값중 제일 작은 small bin size에 헤더포함 0x90 사이즈인 청크가 들어가있습니다. 또한 small bin의 가장 큰 사이즈인 0x3f0 사이즈의 청크가 small_bins[62]에 들어가 있는걸 확인 할 수 있습니다.
만약 free 하려는 기준으로 이전 or 다음 청크가 free된 청크라면 병합이 이뤄지고, 병합된 청크는 다시 unsorted bin으로 들어갈 것입다.