C++는 메모리를 세밀하게 관리할 수 있는 강력한 도구를 제공한다.
이를 제대로 활용하려면 프로세스 메모리 구조를 이해하고, 정적 할당과 동적 할당의 차이를 명확히 알아야 한다.
컴퓨터에서 프로그램이 실행되면 운영체제는 프로세스에 필요한 메모리를 여러 영역으로 나눈다. 이 구조는 크게 네 가지로 구성된다:
C++에서 이 네 가지 영역은 메모리 최적화와 성능 개선에 중요한 역할을 한다.
스택은 함수 호출 시 필요한 지역 변수와 매개변수를 저장한다.
함수가 호출될 때 스택에 데이터가 "쌓이고(push)", 함수가 종료되면 메모리가 "꺼내진다(pop)".
특징:
예제:
void func() {
int localVar = 10; // 스택에 저장
}
힙은 실행 중에 동적으로 메모리를 할당하는 영역이다.
new와 malloc으로 메모리를 요청하며, 반드시 delete나 free로 해제해야 한다.
특징:
예제:
int* heapVar = new int(20); // 힙에 메모리 할당
delete heapVar; // 메모리 해제
데이터 영역은 전역 변수와 static 변수를 저장한다.
초기화 여부에 따라 BSS 영역과 Data 영역으로 나뉜다.
특징:
예제:
int globalVar; // BSS (초기화되지 않음)
int initializedVar = 42; // Data (초기화됨)
static int staticVar = 99; // Data
코드 영역은 프로그램의 실행 코드를 저장한다.
컴파일러가 생성한 바이너리 코드가 저장되며, 읽기 전용(Read-Only)으로 설정된다.
C++에서 변수와 데이터는 정적 할당(Static Allocation)과 동적 할당(Dynamic Allocation) 두 가지 방식으로 메모리에 할당된다. 이를 이해하면 메모리를 효과적으로 관리하고, 성능과 안정성을 높일 수 있다.
컴파일 단계에서 메모리를 할당하고, 프로그램 종료 시까지 유지된다.
데이터 영역(BSS, Data)이나 코드 영역에 저장된다.
특징:
예제:
int globalVar = 10; // Data 영역
static int staticVar = 20; // Data 영역
프로그램 실행 중에 메모리를 할당하며, 주로 힙 메모리를 사용한다.
동적 할당된 메모리는 개발자가 명시적으로 해제해야 한다.
특징:
예제:
int* heapVar = new int(30); // 힙에 동적 할당
delete heapVar; // 메모리 해제
C++는 메모리를 세밀하게 관리할 수 있는 다양한 도구를 제공한다.
대표적인 도구로는 스마트 포인터(Smart Pointer)가 있다.
스마트 포인터는 C++에서 동적 메모리를 자동으로 관리하기 위한 도구다.
std::unique_ptr, std::shared_ptr를 사용하면 메모리 누수를 방지할 수 있다.
예제:
#include <memory>int main() {
std::unique_ptr<int> ptr = std::make_unique<int>(10); // 메모리 자동 해제
return 0;
}
