엄범


이게 아주 중요한 이슈인데, 
memory leak은 구조체, 포인터의 배열 등 동적 할당 받은 공간이 또 다른 동적 할당 받은 더 큰 공간의 entry가 될 때 자주 발생한다.

다음과 같이 단순한 경우는 그냥 해제 해주면 그만이다.
```c
void normal() {
    void *foo = malloc(4);
    free(foo);
}
```

근데 문제는 다음과 같은 상황이다.
```c
typedef struct _ {
int *record[3];
} Bucket;

Bucket *bucket;

void insertEntry() {
int *foo = (int*)malloc(sizeof(int));
*foo = 1;
bucket->record[0] = foo;
}

void leak() {
bucket = (Bucket*)malloc(sizeof(Bucket));
insertEntry();
printf("%d", *(bucket->record[0]));
free(bucket->record[0]);    // !! 이거 빼먹으면 leak !!
free(bucket);
}
```
`` bucket``이 가지고 있는 entry도 동적 할당 받은 공간을 가리키는 포인터이므로, 이 걸 먼저 ``c free()``해 준 다음 버킷을 ``c free()``해야 한다.
근데 프로그램이 복잡해 지는 경우 이를 잊어버리는 경우가 종종 있어 memory leak으로 이어진다.

왜 그렇냐?는 glibc malloc 코드 보면서 gdb로 heap chunk가 어떻게 할당되고, 어떻게 회수되는지를 조사해보면 알 수 있는데, 직접 하기 귀찮거나 하는 법도 모르겠다면 다음 내용을 읽어보면 도움이 될 것이다.