[CS기초] 동적 메모리 할당 (힙, sbrk, malloc ,free)

2025. 4. 27. 22:50·크래프톤 정글/CS기초(키워드, 개념정리)

동적 메모리 할당 (힙, sbrk, malloc ,free)

운영체제와 시스템 프로그래밍을 공부할 때 빠질 수 없는 주제 중 하나가 바로 동적 메모리 할당(Dynamic Memory Allocation)인데요. 이번 글에서는 동적 메모리 할당과 관련된 핵심 개념들인 힙(Heap), sbrk, malloc, free에 대해 정리해 보겠습니다.

 

 

동적 메모리 할당이란?

  • 정의: 프로그램 실행 도중에 필요한 메모리 크기를 결정하고, 이를 운영체제로부터 요청하여 사용하는 것
  • 필요성
    • 컴파일 시점에 데이터 크기를 알 수 없는 경우
    • 프로그램 실행 중 데이터 구조(배열, 연결 리스트 등)의 크기가 가변적인 경우
  • 대표 예시
    • malloc, calloc, realloc, free 함수 사용

 

힙(Heap) 영역

  • 정의
    • 프로그램 메모리 영역 중 하나로, 동적 할당을 위해 사용되는 공간
    • 스택(Stack)과 반대 방향(아래에서 위로)으로 메모리가 확장된다
  • 특징
    • 명시적으로 할당(malloc)하고 해제(free)해야 한다
    • 메모리 누수(leak)와 단편화(fragmentation) 문제가 발생할 수 있다

 

sbrk와 brk

  • sbrk(intptr_t increment):
    • 힙 영역의 끝 주소를 증가시키는 시스템 호출
    • 전통적인 메모리 할당 방법
    • increment만큼 프로그램 데이터 세그먼트(힙)의 크기를 늘린다
    • sbrk(0)은 현재 프로그램 브레이크(힙의 끝)를 반환한다
  • brk(void *end_data_segment):
    • 브레이크 포인터를 직접 지정하는 시스템 호출. (보통 sbrk보다 사용이 덜 일반적임)

참고로, 현대 시스템에서는 sbrk 대신 mmap을 활용하여 메모리를 관리하는 경우도 많은데요. 특히 대규모 메모리 요청 시에 이를 많이 활용하게 됩니다.

 

 

malloc과 free

malloc

  • malloc(size_t size)
  • 기능: size 바이트만큼 힙에서 메모리를 할당하고 그 포인터를 반환
  • 실패 시 NULL 반환
  • 내부 동작
    • 필요한 크기의 블록을 찾아 반환하거나
    • 적절한 블록이 없으면 sbrk로 힙을 확장
int *arr = (int *)malloc(10 * sizeof(int));
if (arr == NULL) {
    // 메모리 할당 실패 처리
}

free

  • free(void *ptr)
  • 기능: malloc 등으로 할당한 메모리를 해제.
  • 주의사항
    • 이미 해제된 메모리를 다시 해제(double free)하면 안 됨
    • 해제한 후 해당 포인터를 사용하면 use-after-free 에러 발생
free(arr);
arr = NULL; // 습관적으로 NULL로 초기화하면 좋음.

 

 

추가로 알아두면 좋은 것들

  • calloc: 초기화를 0으로 채운 후 메모리를 할당하는 함수
  • realloc: 이미 할당된 메모리 블록의 크기를 조정하는 함수
  • 메모리 단편화 문제
    • 많은 할당/해제 작업 후 힙이 조각나게 되면 메모리 낭비가 발생할 수 있음
  • 메모리 누수
    • malloc으로 할당한 메모리를 free하지 않으면 프로그램 종료 전까지 해제되지 않아 리소스가 낭비됨

 

저작자표시 비영리 변경금지 (새창열림)

'크래프톤 정글 > CS기초(키워드, 개념정리)' 카테고리의 다른 글

[CS기초] 메모리 할당 정책 (Memory Allocation Policies)  (0) 2025.04.28
[CS기초] 메모리 단편화(Memory Fragmentation)  (0) 2025.04.28
[CS기초] 가상 메모리(Virtual Memory)와 페이징(Paging)  (0) 2025.04.26
[중간정리] 6주차 - C언어(포인터), 이진탐색트리/RB트리/AVL트리  (0) 2025.04.23
[CS기초] 6주차 개념 정리  (0) 2025.04.22
'크래프톤 정글/CS기초(키워드, 개념정리)' 카테고리의 다른 글
  • [CS기초] 메모리 할당 정책 (Memory Allocation Policies)
  • [CS기초] 메모리 단편화(Memory Fragmentation)
  • [CS기초] 가상 메모리(Virtual Memory)와 페이징(Paging)
  • [중간정리] 6주차 - C언어(포인터), 이진탐색트리/RB트리/AVL트리
그냥사람_
그냥사람_
IT 관련 포스팅을 합니다. 크래프톤 정글 8기 정경호
  • 그냥사람_
    그냥코딩
    그냥사람_
  • 전체
    오늘
    어제
    • 글 전체보기 N
      • 크래프톤 정글 N
        • 로드 투 정글(입학시험)
        • CS기초(키워드, 개념정리) N
        • 컴퓨터구조(CSAPP)
        • Code 정글(C언어) N
        • 마이 정글(WIL, 에세이) N
      • 자료구조&알고리즘
        • 자료구조
        • 알고리즘
      • 일상
  • 블로그 메뉴

    • 홈
  • 링크

    • Github
  • hELLO· Designed By정상우.v4.10.3
그냥사람_
[CS기초] 동적 메모리 할당 (힙, sbrk, malloc ,free)
상단으로

티스토리툴바