서두르지 말고 쉬지 말자

C언어와 동적할당 본문

코딩 공부/C언어

C언어와 동적할당

philos 2025. 4. 30. 14:20

동적할당이란?

 동적할당(Dynamic Memory Allocation)은 프로그램이 실행되는 런타임(실행 중)에 메모리 공간을 필요에 따라 할당하고 해제하는 기법이다. 이는 프로그램이 시작될 때 미리 메모리 크기를 정해두는 정적할당(static allocation)과 대비되는 개념이다

동적할당이 필요한 이유

  • 프로그램 실행 전에 필요한 메모리 크기를 예측할 수 없는 경우가 많음
  • 입력 데이터의 크기, 사용자 요구 등 런타임에 결정되는 변수 대응
  • 메모리를 효율적으로 사용하여 낭비를 줄임 (필요할 때만 할당, 사용 후 해제)

동적할당의 동작 방식

  • 할당: 런타임에 메모리(주로 힙 영역)를 요청하여 확보
  • 사용: 확보한 메모리 공간을 포인터로 접근하여 사용
  • 해제: 사용이 끝난 메모리 공간을 명시적으로 반환(해제)해야 함

사용되는 주요 함수(stdlib.h에 있음)

1. malloc

void* malloc(size_t size);

기능 : 지정된 크기(size bytes)의 메모리 블록 할당(초기화 되지 않은 채로 할당)

2. calloc

void* calloc(size_t num, size_t size);

기능: num개 요소 각각 size bytes 크기의 메모리 할당 후 0으로 초기화

3.realloc

void* realloc(void* ptr, size_t new_size);

기능: 기존 메모리 블록 크기 조정 (확장/축소)

4. free

void free(void* ptr);

기능: 할당된 메모리 해제

중요 규칙

1. 할당된 주소만 해제: 포인터 연산으로 변형된 주소(arr+1 등)는 해제 불가

2. 이중 해제 금지: 이미 해제된 메모리 재해제 시 오류 발생

메모리 누수

  메모리 누수(Memory leak)는 프로그램이 동적으로 할당한 메모리를 사용한 후 해제하지 않아, 시스템 메모리가 점차 고갈되는 현상이다. 이는 더 이상 사용되지 않는 메모리가 힙(Heap) 영역에 남아 있어 발생하며, 장기적으로는 프로그램 성능 저하나 Out of Memory 오류를 유발한다.

주요 원인

  • 명시적 해제 누락: malloc, calloc으로 할당한 메모리를 free로 해제하지 않은 경우
  • 포인터 주소 손실: 할당된 메모리의 시작 주소를 잃어버린 경우 (예: realloc 사용 시)
  • 순환 참조: 객체가 서로를 참조하여 가비지 컬렉션을 방해하는 경우

메모리 누수 방지 전략

  • 할당-해제 쌍 맞추기: malloc ↔ free를 반드시 대응시킴
  • 임시 포인터 활용

 

 

반응형

'코딩 공부 > C언어' 카테고리의 다른 글

구조체, 공용체, 열거체  (0) 2025.04.30