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 호환 코드 |
'C++' 카테고리의 다른 글
| C++ std::jthread란? (0) | 2025.09.10 |
|---|---|
| C++ 재귀함수란? 재귀함수는 어디에 쓰일까요 (0) | 2024.02.06 |
| [C++ 기술면접] C++ new 연산자와 C언어 malloc 함수의 차이점은? (0) | 2024.02.05 |
| C++ enum class란? 그리고 enum class 사용하면 좋은 이유? (0) | 2024.02.05 |
| C++ expected unqualified-id before numeric constant error 해결 방법 (0) | 2024.01.28 |