실습 환경 : 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 부분)이 실행된 직후의 메모리 상황을 살펴보겠습니다.

Untitled

small_bins[8]에 fast chunk size 보다 큰 값중 제일 작은 small bin size에 헤더포함 0x90 사이즈인 청크가 들어가있습니다. 또한 small bin의 가장 큰 사이즈인 0x3f0 사이즈의 청크가 small_bins[62]에 들어가 있는걸 확인 할 수 있습니다.

만약 free 하려는 기준으로 이전 or 다음 청크가 free된 청크라면 병합이 이뤄지고, 병합된 청크는 다시 unsorted bin으로 들어갈 것입다.