`free` — 할당한 메모리를 해제하는 함수

free — 할당한 메모리를 해제하는 함수

malloc이나 calloc으로 메모리를 잡았으면, 다 쓴 뒤에는 꼭 돌려줘야 해요. 그걸 하는 게 free입니다. 돌려주지 않으면 메모리 누수(memory leak)가 생기죠.

출처: cppreference — free

본문

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 원문에서 표준 항목별 세부 규칙을 더 확인할 수 있어요.