힙 영역과 동적 할당의 필요성

Jaemyeong Lee·2024년 12월 7일

게임 서버1

목록 보기
48/220

이 Step에서 다루는 것

  • 프로그램 메모리 영역 4가지(코드/데이터/스택/힙) 복습
  • “왜 힙(동적 할당)이 필요한가?”를 스택·데이터의 한계로 증명
  • new/malloc이 실제로 하는 일: OS에 메모리 요청 → 시작 주소(pointer) 반환
  • 힙을 쓰면 생기는 필수 책임: 해제(수명 관리), (감각) 단편화

학습 목표

  • “스택/데이터로 해결 못 하는 문제”를 수명/크기 관점에서 설명할 수 있다.
  • 동적 할당이 “메모리를 하나 더 만드는 마법”이 아니라 주소를 받아서 관리하는 방식임을 설명할 수 있다.

메모리 영역 복습(코드/데이터/스택/힙)

  • 코드 영역(Text): 실행 코드(명령어). 보통 프로그램 동안 1개
  • 데이터 영역(Data/BSS): 전역 변수, 정적(static) 변수. 프로그램 시작~종료까지 유지
  • 스택(Stack): 함수 호출 단위로 쌓이는 메모리(지역 변수/매개변수 등). 보통 스레드마다 크기 제한
  • 힙(Heap): 실행 중 “필요할 때” 할당/해제하는 메모리 영역

메모리 영역 구조(감각)

┌─────────────────────────────────────────────────────────────────────────────┐
│  코드 영역          │  데이터 영역                 │  스택 영역      │  힙 영역   │
├─────────────────────┼─────────────────────────────┼─────────────────┼───────────┤
│  실행 코드          │  전역·정적 변수              │  지역 변수      │  new/malloc│
│  (대체로 고정)      │  (시작~종료까지 유지)         │  (호출~리턴)    │  (필요시)  │
└─────────────────────────────────────────────────────────────────────────────┘

스택·데이터의 한계(= “힙이 필요한 이유”)

스택(Stack)의 한계: “크기 제한 + 짧은 수명”

  • 스택은 보통 크기가 고정(스레드별 제한)이라 큰 배열/객체를 올리면 위험합니다.
  • 지역 변수는 함수가 끝나면 바로 사라지므로(수명 종료) “오래 살아야 하는 데이터”에 부적합합니다.
// ❌ (감각) 스택에 큰 배열은 위험
Monster monsters[1'000'000];

데이터(Data)의 한계: “너무 긴 수명(항상 유지)”

  • 데이터 영역은 한 번 잡히면 프로그램 종료까지 유지됩니다.
  • “유저가 1명일 때는 0마리, 1만 명일 때는 50만 마리”처럼 규모가 요동치는 게임 객체를
    데이터 영역으로 잡으면 항상 메모리를 붙잡고 있어 비효율이 됩니다.

결론

  • “실시간 생성/소멸이 필요한 수많은 객체”는
    스택(너무 작고 짧음) / 데이터(너무 길고 고정) 만으로는 운영이 어렵습니다.
  • 그래서 “필요할 때 늘리고, 필요 없으면 줄이는” 힙(동적 할당)이 필요합니다.

동적 할당(Dynamic Allocation) = 주소를 받아 관리하는 방식

동적 할당의 흐름은 한 줄로 요약됩니다.

  • 요청할당사용해제

그리고 중요한 사실:

  • 우리 프로그램은 메모리를 직접 늘릴 수 없어서, 내부적으로 운영체제(또는 런타임/할당자)에 요청합니다.
  • new/malloc은 “할당된 영역의 시작 주소(pointer)”를 돌려줍니다.

실전에서 기억할 점:

  • 힙은 “편한 만큼” 위험도 같이 옵니다. 해제 누락(메모리 누수), 잘못된 해제, (감각) 단편화가 대표적입니다.
    (다음 Step에서 malloc/free vs new/delete로 정확히 비교합니다.)

profile
李家네_공부방

0개의 댓글