Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

free() 함수는 해제할 메모리의 크기를 어떻게 알아낼까?

C 언어에서 free() 함수는 malloc(), calloc(), realloc()으로 동적 할당된 메모리를 해제하는 데 사용됩니다. 사용법은 매우 간단합니다. 해제하고자 하는 포인터를 인자로 넘겨주기만 하면 됩니다.

free(ptr);

흥미로운 질문: 크기 정보는 어디에 있을까?

여기서 의문이 생깁니다. free() 함수는 포인터만 인자로 받을 뿐, 메모리의 크기를 전혀 전달받지 않습니다. 그렇다면 free()는 대체 어떻게 해제해야 할 메모리 블록의 크기를 알 수 있는 걸까요?

힙(Heap) 영역의 비밀: 숨겨진 메타데이터

답은 동적 메모리 할당이 실제로 이루어지는 힙(heap) 영역에 있습니다. 프로그램이 동적 메모리 할당을 요청하면, 시스템은 요청된 크기보다 한 워드(word) 더 큰 공간을 힙에 확보합니다.

이렇게 추가로 확보된 공간에는 해당 메모리 블록의 크기 정보가 저장됩니다. 즉, 할당된 메모리 블록 앞쪽에는 관리용 메타데이터가 함께 존재하는 셈입니다.

free()의 동작 원리

free(ptr)이 호출되면 다음과 같은 과정이 일어납니다.

  • 전달받은 포인터 ptr이 가리키는 위치 바로 앞에 저장된 메타데이터를 읽습니다.
  • 메타데이터에 기록된 크기 정보를 확인하여 해제해야 할 메모리 블록의 정확한 크기를 파악합니다.
  • 해당 크기만큼의 메모리 공간을 회수하여 이후 다른 할당 요청에 재사용할 수 있도록 처리합니다.

정리

결국 free()가 크기를 별도로 전달받지 않아도 되는 이유는, 메모리를 할당할 때 이미 크기 정보가 힙 영역에 함께 저장되어 있기 때문입니다. 개발자에게는 보이지 않지만, 메모리 관리 시스템이 내부적으로 이 정보를 활용해 안전하게 메모리를 해제하는 것입니다.