C++ 프로그램이 실행되면, 메모리는 다음과 같이 나뉘어 사용된다.

| 스택과 힙은 메모리 관리의 핵심이다
지역 변수 → 스택
실행 중 유동적인 데이터 → 힙
함수 호출 시 자동으로 할당되고 종료 시 해제
지역 변수, 매개변수 등이 저장
LIFO 구조로 빠르게 처리 가능
void func() {
int x = 10; // x는 스택에 저장됨
}
빠르고 효율적
크기 제한 있음 (Stack Overflow 가능)
프로그램 실행 중 동적으로 메모리 할당
new, malloc 등을 통해 생성
수동으로 delete, free 해야 함 (C++에서는 스마트 포인터로 자동화 가능)
int* ptr = new int; // 힙에 int 크기만큼 메모리 할당
*ptr = 100;
delete ptr; // 직접 해제하지 않으면 메모리 누수 발생
유연한 메모리 사용
할당/해제 속도 느림, 관리 어려움
| 구분 | Stack | Heap |
|---|---|---|
| 할당 방법 | 컴파일 타임, 자동 | 런타임, 명시적 (new, malloc) |
| 할당 속도 | 빠름 | 느림 |
| 해제 방법 | 자동 (함수 종료 시 해제) | 수동 (delete, free) |
| 메모리 크기 | 제한적 (작음) | 유동적 (크게 사용 가능) |
| 주 사용처 | 지역 변수, 매개변수 | 동적 배열, 객체 등 |
void useStack() {
int x = 10; // 스택에 저장됨
int arr[100]; // 배열도 스택에
}
void useHeap() {
int* x = new int; // 힙에 저장
int* arr = new int[100]; // 힙에 배열
delete x;
delete[] arr;
}
스택 오버플로우(Stack Overflow)
스택 크기를 초과해 지역 변수를 선언하거나 무한 재귀를 사용하면 발생
예: int arr[100000000]; 또는 func() { func(); }
메모리 누수(Memory Leak)
힙에 할당한 메모리를 해제하지 않고 잊은 경우
예: new로 생성 후 delete 없이 종료