힙과 스택

프로세스 메모리의 두 할당 영역

프로세스의 메모리는 스택과 힙으로 나뉜다. 스택은 함수 호출 시 자동으로 할당/해제되어 빠르고, 힙은 malloc 같은 할당자로 직접 요청하고 free로 해제해야 한다. 힙을 해제하지 않으면 메모리 누수가 발생하며, Python이나 Java는 GC가 이 해제를 대신 해준다.

Memory

개념

프로세스의 메모리는 크게 스택과 힙 두 영역으로 나뉜다. 자료구조의 스택/힙과 이름만 같고 다른 개념이다.

  • 스택 — 함수 호출할 때 자동으로 할당되고, 함수 끝나면 자동으로 해제. 지역 변수, 매개변수, 리턴 주소가 여기 저장됨
  • — 개발자가 직접 요청해서 할당. 함수가 끝나도 안 사라지고, 명시적으로 해제하거나 GC가 치워야 함

C 기준 동작

C에서 스택과 힙의 차이가 가장 명확하게 드러난다.

int x = 10;                    // 스택에 값 10이 직접 들어감
int *p = malloc(sizeof(int));  // p(포인터)는 스택, malloc이 잡아준 공간은 힙
free(p);                       // 힙 공간을 직접 해제

malloc 없이 선언한 변수는 스택, malloc으로 요청한 공간은 힙이다. 포인터 변수 자체는 스택에 있고, 포인터가 가리키는 곳이 힙이다.

스택이 빠른 이유

스택은 포인터 하나를 위아래로 옮기면 끝이다. 함수 호출하면 스택 포인터를 내려서 공간을 만들고, 함수가 끝나면 올려서 정리한다.

힙은 "빈 공간이 어디 있지?" 하고 찾아다녀야 한다. 할당과 해제가 순서 없이 일어나서 빈 공간이 여기저기 흩어져 있기 때문이다.

메모리 누수

malloc으로 힙에 공간을 잡아놓고 free()를 안 하면 그 메모리가 프로세스가 끝날 때까지 남아있다. 이것이 메모리 누수(memory leak)다. 서버처럼 오래 돌아가는 프로세스에서 누수가 쌓이면 메모리가 점점 차서 결국 스왑과 스래싱으로 이어진다.

Python의 경우

Python은 모든 것이 객체라서 x = 10이면 x(이름표)는 스택에, 10(정수 객체)은 힙에 만들어진다. 하지만 free()를 직접 호출할 필요가 없다. GC(Garbage Collector)가 더 이상 참조되지 않는 객체를 자동으로 해제해준다.

  • Cmalloc으로 할당, free로 직접 해제
  • Python/Java — 힙 할당/해제를 GC가 대신 처리

더 보기

sunshinemoon · 2026