`free` — 할당한 메모리를 해제하는 함수
free — 할당한 메모리를 해제하는 함수
malloc이나 calloc으로 메모리를 잡았으면, 다 쓴 뒤에는 꼭 돌려줘야 해요. 그걸 하는 게 free입니다. 돌려주지 않으면 메모리 누수(memory leak)가 생기죠.
본문
free는 이전에 malloc(), calloc(), aligned_alloc()(C11부터), 또는 realloc()이 할당한 공간을 해제해요.
문법
#include <stdlib.h>
void free( void *ptr );
설명
ptr이 널 포인터면 함수는 아무것도 하지 않아요. 이 동작 때문에 null check를 매번 하지 않아도 되는 거죠.
ptr의 값이 이전에 malloc(), calloc(), realloc(), 또는 aligned_alloc()(C11부터)이 돌려준 값과 다르면 동작은 정의되지 않습니다(undefined behavior). ptr이 가리키는 메모리 영역이 이미 해제된 상태이거나, 해제된 뒤 다시 그 포인터로 접근해도 마찬가지로 동작이 정의되지 않아요.
free는 스레드 안전(thread-safe)해요. 인자를 통해 보이는 메모리 위치만 접근하는 것처럼 동작하죠. 한 영역의 메모리를 해제하는 free 호출은, 같은 영역이나 그 일부를 할당하는 이후의 어떤 할당 함수 호출과도 동기화됩니다.
매개변수
| 매개변수 | 설명 |
|---|---|
ptr |
해제할 메모리를 가리키는 포인터 |
반환값
없음.
주의
이 함수가 널 포인터를 받아들이고(그리고 아무것도 안 하고) 있는 건, 그만큼 특수한 경우를 줄여 주기 때문이에요. 할당 함수가 돌려준 포인터는, 할당이 성공했는지 실패했는지와 무관하게, free()에 넘길 수 있습니다.
예시
할당한 포인터를 모두 해제해 주는 기본기를 보여 주는 예시예요.
#include <stdlib.h>
int main(void)
{
int *p1 = malloc(10 * sizeof *p1);
free(p1); // every allocated pointer must be freed
int *p2 = calloc(10, sizeof *p2);
int *p3 = realloc(p2, 1000 * sizeof *p3);
if (p3) { // p3 not null means p2 was freed by realloc
free(p3);
}
else { // p3 null means p2 was not freed
free(p2);
}
}
realloc의 반환값이 널이 아니면 p2는 이미 realloc이 해제한 상태라 p3만 해제하고, 널이면 realloc이 실패해서 p2가 아직 살아 있으니 p2를 해제하는 걸 볼 수 있어요.
더 알아보기
malloc— 메모리를 할당해요.free_sized— 크기가 지정된, 이전에 할당한 메모리를 해제해요 (C23).free_aligned_sized— 크기와 정렬이 지정된, 이전에 할당한 메모리를 해제해요 (C23).- cppreference의 free 원문에서 표준 항목별 세부 규칙을 더 확인할 수 있어요.