storage_duration — 저장 기간

storage_duration — 저장 기간 (Storage duration)

**저장 기간(storage duration)**은 객체가 메모리에 얼마나 오래, 어디에 존재하는지를 정의하는 개념이에요. 자동, 정적, 스레드, 동적의 네 종류가 있어요.

객체의 수명(lifetime)은 그 저장 기간과 초기화 방식에 따라 결정돼요. 언제 객체가 생성되고 파괴되는지 이해하는 것이 메모리 관리의 핵심이에요.

출처: cppreference

본문

저장 기간은 객체의 저장에 대한 규칙이에요. C++에는 네 가지 저장 기간이 있어요.

자동 저장 기간 (Automatic storage duration)

  • 범위(블록) 안의 지역 변수가 기본으로 가져요.
  • 블록에 진입하면 생성되고, 블록을 벗어나면 소멸돼요 (역순으로).
  • 예: 함수 안의 int x;
void f() {
    int x = 5;      // 여기서 생성
    { int y = 6; }  // y 는 여기서 소멸
}                   // x 는 여기서 소멸

정적 저장 기간 (Static storage duration)

  • 전역 변수, static 변수, static 멤버가 가져요.
  • 프로그램 시작 시 생성되고, 프로그램 종료 시 소멸돼요.
  • 0 초기화 후 초기화돼요.
int global = 42;             // 전역: 정적 저장 기간
static int file_local = 7;   // 정적

스레드 저장 기간 (Thread storage duration)

  • thread_local 변수가 가져요.
  • 각 스레드마다 별도의 객체가 존재해요.
  • 스레드 시작 시 생성, 스레드 종료 시 소멸.
thread_local int tls = 0;

동적 저장 기간 (Dynamic storage duration)

  • new로 할당한 객체가 가져요.
  • 명시적으로 delete할 때까지 수명이 지속돼요.
  • 힙(heap)에 존재하고, 스코프와 무관해요.
int* p = new int(42);
// ... 사용
delete p;   // 명시적으로 해제

정리 요약

저장 기간 생성 소멸 위치
자동 블록 진입 블록 탈출 스택
정적 프로그램 시작 프로그램 종료 전역 메모리
스레드 스레드 시작 스레드 종료 스레드 로컬
동적 new delete

노트 (Notes)

  • static/thread_local/extern 지정자는 변수 선언에 저장 기간이나 연결을 지정해요.
  • 동적 객체는 RAII(스마트 포인터)로 관리하는 것이 권장돼요.
  • 저장 기간과 연결(linkage)은 별개의 개념이에요.

더 알아보기 (Learn more)

cppreference