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

C++ 전역 메모리 관리: 스택인가, 힙인가?


C++ 프로그램의 메모리 구조 개요

C++ 프로그램이 실행되는 동안 변수는 주로 스택(stack)힙(heap) 두 가지 메모리 영역에 저장되며, 각 영역마다 생성과 소멸 방식이 다릅니다. 반면 전역 변수나 전역 데이터 구조는 이 어느 쪽에도 속하지 않고, 프로그램 시작 시 고정된 메모리 블록(데이터 세그먼트)에 할당되어 프로그램이 종료될 때까지 그 위치와 값이 유지됩니다.

스택(Stack): 자동으로 관리되는 메모리

스택은 함수 호출과 함께 동작하는 LIFO(Last In, First Out) 구조의 메모리 영역입니다. 함수가 호출되면 지역 변수와 매개변수가 스택 프레임에 쌓이고, 함수가 반환되면 해당 프레임이 자동으로 제거됩니다. 별도의 해제 코드가 필요 없고 접근 속도가 빠르다는 장점이 있지만, 크기가 제한적이어서 대용량 데이터를 저장하기에는 적합하지 않습니다.

힙(Heap): 동적 메모리 할당 영역

힙은 실행 시점에 크기를 유연하게 결정할 수 있는 메모리 공간입니다. C 언어에서는 malloc() 함수로, C++에서는 new 연산자로 메모리를 할당합니다. 사용이 끝난 메모리는 반드시 free() 또는 delete로 해제해야 하며, 이를 잊으면 메모리 누수(memory leak)가 발생할 수 있습니다.

전역 변수는 어디에 저장될까?

전역 변수와 정적(static) 변수는 스택이나 힙을 사용하지 않습니다. 이들은 컴파일 타임에 위치가 확정되는 데이터 세그먼트에 배치되는데, 초기화된 변수는 .data 섹션에, 초기화되지 않은 변수는 .bss 섹션에 저장됩니다. 프로그램이 실행되는 전체 기간 동안 동일한 메모리 위치에 존재하며 값도 계속 유지됩니다.

예제 코드

#include <cstdlib>

int a[10];  // 데이터 영역(고정된 메모리 블록)에 할당됨

int main() {
    int localVal = 5;   // 스택에 할당
    float *ptr = (float *)malloc(10 * sizeof(float));  // 힙에 할당

    free(ptr);          // 힙 메모리는 반드시 수동으로 해제
    return 0;
}   // 함수 종료 시 localVal은 자동으로 소멸

세 가지 메모리 영역 비교

구분스택데이터 영역
저장 대상지역 변수, 매개변수동적 할당 객체전역·정적 변수
할당 방식컴파일러가 자동 처리malloc/free, new/delete프로그램 로드 시 할당
생존 기간함수 범위(scope) 내명시적 해제 시까지프로그램 전체 실행 기간
속도매우 빠름상대적으로 느림빠름

정리하면, 지역 변수는 스택에서 자동으로 생성·소멸하고, 실행 중 크기가 변하는 데이터는 힙을 활용하며, 전역 변수는 프로그램 시작부터 종료까지 유지되는 고정된 데이터 영역에 저장됩니다. 각 영역의 특성을 정확히 이해하면 메모리 누수와 성능 문제를 효과적으로 예방할 수 있습니다.