/

C++에서 new와 C 언어의 malloc은 모두 동적 메모리 할당을 하지만, 동작 방식과 특징에서 큰 차이가 있습니다. 핵심 차이점들을 정리하면 다음과 같습니다:


1. 생성자·소멸자 호출 여부

  • new: 객체를 생성할 때 생성자를 자동으로 호출하고, delete로 해제할 때 소멸자를 자동으로 호출합니다.
  • MyClass* obj = new MyClass(10); // 생성자 호출 delete obj; // 소멸자 호출
  • malloc: 단순히 메모리 블록만 할당할 뿐, 생성자나 소멸자를 호출하지 않습니다. 따라서 C++ 객체를 다룰 때는 부적절합니다.
  • MyClass* obj = (MyClass*)malloc(sizeof(MyClass)); // 생성자 호출 안 함 free(obj); // 소멸자 호출 안 함

2. 형식(type) 안전성

  • new: 반환 타입이 명시적입니다. 즉, MyClass*를 반환하므로 형 변환(cast)이 필요 없습니다.
  • malloc: 반환 타입이 void*이므로 C++에서 사용할 때는 형 변환을 직접 해야 합니다.

3. 연산자 vs 함수

  • **new/delete**는 C++ 연산자이고, 오버로딩도 가능합니다.
  • **malloc/free**는 C 표준 라이브러리 함수입니다.

4. 예외 처리

  • new: 메모리 할당 실패 시 std::bad_alloc 예외를 던집니다(기본 동작).
    (원하면 new (std::nothrow)nullptr을 반환하도록 할 수 있습니다.)
  • malloc: 메모리 할당 실패 시 NULL을 반환합니다.

5. 크기 계산

  • new: 타입을 기반으로 필요한 크기를 자동으로 계산합니다.
  • int* arr = new int[10]; // 10개 int에 맞는 크기를 자동 계산
  • malloc: 크기를 직접 바이트 단위로 계산해 넣어야 합니다.
  • int* arr = (int*)malloc(10 * sizeof(int));

6. 사용 용도

  • new: C++ 객체, 클래스, STL 컨테이너 등을 포함해 C++ 전용 코드에 권장됩니다.
  • malloc: 주로 C 스타일 API와 호환이 필요하거나, 단순 메모리 블록이 필요할 때 사용합니다.

핵심 요약

구분 new malloc
생성자·소멸자 자동 호출 호출 안 함
반환 타입 명시적 (형변환 불필요) void* (형변환 필요)
예외 처리 실패 시 예외 던짐 실패 시 NULL 반환
메모리 크기 타입 기반 자동 계산 직접 바이트 계산
사용 권장 C++ 코드 C 호환 코드

 

+ Recent posts