C 언어에서 malloc(), calloc(), realloc()로 받은 메모리는 더 이상 필요 없을 때 free()로 돌려줘야 한다.
간단해 보이지만 잘못 쓰면 찾기 어려운 문제가 생긴다.
형태는 void free(void *ptr) 이다.
ptr이 가리키는 할당 블록을 해제한다.
free(NULL)은 아무 일도 하지 않기 때문에 조건문 없이 호출해도 된다.
반면 스택 변수 주소, 이미 해제한 주소, 할당 블록 중간 주소를 넘기는 것은 정의되지 않은 동작이다.
free()가 포인터 변수 자체를 지우는 것은 아니다. 같은 메모리를 가리키던 다른 포인터가 남아 있다면 NULL 대입과 관계없이 더 이상 사용하면 안 된다.
char *name = malloc(64);
if (name == NULL)
return 1;
snprintf(name, 64, "%s", "chaegeon");
printf("%s\n", name);
free(name);
name = NULL;
free() 뒤 포인터를 NULL로 바꾸면 같은 변수의 실수로 인한 재해제는 줄일 수 있다.
하지만 다른 곳에 복사된 포인터까지 무효화해 주지는 않는다.
해제한 메모리를 다시 읽는 use-after-free와 두 번 해제하는 double free는 보안 취약점으로도 이어진다.
답글 달기