malloc/free vs new/delete

Jaemyeong Lee·2024년 12월 8일

게임 서버1

목록 보기
49/220

이 Step에서 다루는 것

  • C 계열 malloc/free와 C++ 계열 new/delete의 차이
  • “메모리만 잡기” vs “객체를 만들기(생성자/소멸자)”의 차이
  • 가장 위험한 실수: 짝 불일치 (mallocdelete, newfree, new[]delete)

학습 목표

  • malloc이 C++ 객체에 바로 쓰기 위험한 이유를 “생성자/소멸자”로 설명할 수 있다.
  • new[]에는 왜 반드시 delete[]가 필요한지 설명할 수 있다.
  • 짝이 틀리면 왜 “에러가 아니라 UB”가 되는지 감각을 갖는다.

malloc/free (C 스타일) = “메모리 바이트만 확보”

  • malloc/free함수이며, “원시 메모리(raw bytes)”를 다룹니다.
  • malloc(n)n 바이트를 확보하고, 시작 주소를 void*로 반환합니다.
  • C++ 관점에서 중요한 점: 생성자/소멸자를 호출하지 않습니다.
#include <cstdlib>

void* ptr = std::malloc(1000); // 1000바이트 확보
// ... 바이트 단위로 사용 ...
std::free(ptr);                 // malloc으로 잡았으면 free로 해제

C++ 객체에 malloc을 바로 쓰면 왜 위험한가?

struct Monster {
    Monster() : hp(100) {} // 생성자
    ~Monster() {}          // 소멸자(예: 자원 정리)
    int hp = 0;
};

Monster* m = static_cast<Monster*>(std::malloc(sizeof(Monster)));
// ❌ 여기서는 Monster() 생성자가 호출되지 않음 → hp가 100이라는 보장이 없다
std::free(m); // ❌ 소멸자도 호출되지 않음

결론: C++ “객체”를 다룰 때는 malloc/free를 기본으로 쓰지 않습니다. (특수한 경우는 나중에)


new/delete (C++ 스타일) = “메모리 + 객체 생명주기”

  • new/delete연산자이며,
    • new T(...)는 “메모리 확보 + 생성자 호출”
    • delete p는 “소멸자 호출 + 메모리 해제”
Monster* m = new Monster(); // 생성자 호출됨
delete m;                   // 소멸자 호출됨

malloc/free vs new/delete 한눈에 비교

┌─────────────────────────────────────┬────────────────────────────────────────┐
│ malloc/free                          │ new/delete                              │
├─────────────────────────────────────┼────────────────────────────────────────┤
│ 함수                                 │ 연산자                                   │
│ 바이트 메모리 확보/해제               │ 메모리 + 생성자/소멸자(객체 생명주기)     │
│ void* 반환(캐스팅 필요)              │ 타입 포인터 반환                          │
│ C 스타일                              │ C++ 스타일(객체에는 보통 이쪽)            │
└─────────────────────────────────────┴────────────────────────────────────────┘

new[] / delete = “[]는 반드시 짝”

  • new T[N]N개를 연속으로 할당하고, (일반적으로) 생성자 N번 호출
  • delete[]는 (일반적으로) 소멸자 N번 호출 후 해제
  • new[]로 잡은 것을 delete로 지우면 동작이 깨질 수 있습니다(UB)
Monster* arr = new Monster[5];
arr[0].hp = 100;

delete[] arr; // ✅ new[]에는 delete[]

(중요) 짝 불일치 = UB(정의되지 않은 동작)

이 3가지는 “가끔 돌아가는 것처럼 보여도” 위험합니다.

  • std::mallocdelete
  • newstd::free
  • new[]delete (또는 반대)

체크 질문 (스스로 답해보기)

  • malloc이 “메모리는 잡는데, 객체는 못 만든다”는 말의 의미는?
  • newdelete가 각각 “추가로 해주는 일”은 무엇인가?
  • new[]delete[]가 필수인 이유는?

profile
李家네_공부방

0개의 댓글