CS | 포인터와 동적 메모리 할당(malloc vs new)

성수당·2025년 7월 31일

나혼자 CS

목록 보기
14/24
post-thumbnail

🥔 동적 메모리 할당이란?

C/C++에서 배열, 구조체, 클래스 등 다양한 데이터를 동적으로 할당하려면 "동적 메모리 할당"이 필요합니다. 포인터와 함께 쓰이며, 정적(static) 메모리 할당과는 달리 런타임 시 메모리를 직접 관리할 수 있는 강력한 도구입니다.

이번 글에서는 동적 할당의 개념, mallocnew의 차이, 그리고 할당/해제 방법과 주의사항까지 정리해보자.

🥔 정적 메모리 vs 동적 메모리

항목정적 메모리동적 메모리
할당 시점컴파일 시실행 시
크기 변경불가능가능
예시int arr[100];int* arr = new int[n];
해제자동수동 (delete, free)

🥔 동적 메모리 할당이 필요한 이유

  • 배열 크기를 실행 중에 결정해야 할 때

  • 큰 데이터 구조(트리, 그래프 등)를 유연하게 생성할 때

  • 함수에서 만든 데이터를 반환할 때

  • 리소스를 명확하게 제어하고 싶을 때

🥔 C 언어 방식: malloc() / free()

  • 기본 문법
#include <cstdlib>  // malloc, free

int* arr = (int*)malloc(sizeof(int) * 5);  // int 5개 공간 할당

if (arr == NULL) {
    // 메모리 부족 등 예외 처리
}

arr[0] = 10;

free(arr);  // 메모리 해제
  • malloc(size_t size): 바이트 단위로 메모리 블록을 할당

  • free(ptr): malloc 등으로 할당한 메모리 해제

🥔 C++ 방식: new / delete

  • 기본 문법
int* arr = new int[5];  // int 5개 공간 할당
arr[0] = 10;

delete[] arr;  // 배열일 경우 delete[]
  • 단일 변수일 경우
int* a = new int;
*a = 42;

delete a;

🥔 malloc vs new 차이점

항목malloc / freenew / delete
언어C / C++C++ 전용
타입 캐스팅필요 ((int*))불필요
생성자 호출XO (객체 생성 시)
예외 처리NULL 반환예외(throw) 발생
할당 방식함수연산자(Operator)

| C++에서는 가능하면 new/delete를 사용하자

🥔 동적 할당 시 주의사항

  • new/delete, malloc/free는 반드시 쌍으로 사용

  • 해제하지 않으면 메모리 누수(memory leak) 발생

  • 해제 후에는 포인터를 nullptr로 바꾸는 습관 권장

  • 이미 해제된 메모리를 또 해제하거나 접근하면 undefined behavior

🥔 메모리 누수

void leak() {
    int* p = new int[100];  // 할당
    // delete[] p;  // 해제 안함 → 메모리 누수
}

→ 이런 문제가 쌓이면 프로그램이 느려지거나, 종료됨.

profile
말하는 감자🥔

0개의 댓글