[C/C++]의 동적 할당과 Memory leak
이게 아주 중요한 이슈인데,
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가 어떻게 할당되고, 어떻게 회수되는지를 조사해보면 알 수 있는데, 직접 하기 귀찮거나 하는 법도 모르겠다면 다음 내용을 읽어보면 도움이 될 것이다.
2017/07/19 - [System/Exploit] - [glibc] malloc - 1
2017/07/19 - [System/Exploit] - [glibc] malloc - 2
2017/07/21 - [System/Exploit] - [glibc] malloc - 3
2017/07/21 - [System/Exploit] - [glibc] malloc - 4
'Languages & Frameworks > C C++' 카테고리의 다른 글
[C/C++] clock : 수행 시간 측정 / logging : 에러 출력 (0) | 2018.08.09 |
---|---|
[C++] File IO : <ifstream> 과 pubsetbuf() (0) | 2018.08.03 |
[C] system V IPC (0) | 2017.11.10 |
[C] dll을 이용한 메모리(데이터) 공유 (0) | 2017.11.10 |
[C] dup2 + pipe (0) | 2017.10.12 |