스택(stack)
개념
- 함수 호출과 관련된 메모리를 저장하는 영역으로 함수가 호출될 때마다 그 함수의 지역 변수들이 스택에 저장되며, 함수가 종료되면 해당 변수들이 자동으로 해제됨.
- 후입선출(LIFO, Last In First Out) 방식으로 동작. -> 마지막에 들어간 데이터가 가장 먼저 나옴.
특징
- 빠른 할당과 해제 : 스택은 메모리 할당과 해제가 매우 빠름. 함수가 호출되면 필요한 메모리 공간이 스택에 자동으로 할당되고, 함수가 종료되면 해당 메모리가 자동으로 해제됨.
- 자동 관리 : 스택에 할당된 메모리는 개발자가 직접 관리할 필요가 없으며, 함수 호출과 반환에 맞춰 자동으로 관리됨.
- 메모리 제한 : 스택은 크기가 제한적. 너무 많은 메모리를 할당하거나 깊은 재귀 호출을 하게 되면 스택 오버플로우가 발생할 수 있음.
- 저장되는 것들 : 지역 변수, 함수 호출 시의 반환 주소, 함수 호출 시의 매개 변수 등.
예시
#include <iostream>
using namespace std;
void function() {
int x = 10; // x는 스택에 저장
cout << "x = " << x << endl;
}
int main() {
function(); // function 호출 시 스택에 메모리가 할당됨
return 0; // function 종료 시 x가 자동으로 해제됨
}
힙(heap)
개념
- 동적으로 메모리를 할당할 때 사용하는 영역(동적 배열, 객체 생성 등). 프로그램이 실행 중에 동적으로 메모리를 할당하고 해제할 수 있음.
- 메모리 관리 방식이 자유롭고, 크기 제한이 거의 없지만, 스택과 달리 메모리 관리하는데 더 많음 주의가 필요.
특징
- 동적 메모리 할당 : "new"나 "malloc"같은 명령어로 메모리를 동적으로 할당 가능. 이 메모리는 프로그램 종료 후에도 수동으로 해제할 때까지 계속 존재함.
- 메모리 해제 책임 : 힙에 할당된 메모리는 자동으로 해제되지 않기 때문에, "delete" 또는 " "free"를 사용하여 명시적으로 메모리를 해제해야 함. 그렇지 않으면 메모리 누수가 발생할 수 있음.
- 크기 제한 없음 : 힙의 크기는 스택에 비해 훨씬 크며, 시스템에서 사용할 수 있는 메모리의 양에 따라 다름.
- 속도 : 스택보다 메모리 할당과 해제가 느림. 또한, 힙에서의 메모리 할당은 메모리 관리 시스템에 의존하므로 성능이 스택보다 떨어질 수 있음.
예시
#include <iostream>
using namespace std;
void function() {
int* ptr = new int; // 힙에 메모리 할당
*ptr = 20;
cout << "*ptr = " << *ptr << endl;
delete ptr; // 할당된 메모리를 명시적으로 해제
}
int main() {
function();
return 0;
}