[C++] new 와 malloc의 차이점

김세희·2025년 7월 21일

new / malloc

둘 다 메모리를 할당한다. new는 연산자 이고 malloc은 함수이다.

주요 차이점

1. 언어 및 문법

  • new: C++ 연산자. 객체 지향 프로그래밍의 특징인 생성자/소멸자 호출을 지원한다.
  • malloc: C 표준 함수. 메모리 블록을 할당하는 순수한 메모리 관리 함수. C++에서는 주로 new를 사용한다.

2. 생성자/소멸자 호출

  • new: 객체를 할당할 때 자동으로 해당 클래스의 생성자를 호출한다. delete로 메모리를 해제할 때도 소멸자를 자동으로 호출한다.
  • malloc: 단순히 지정된 크기만큼의 메모리 공간을 할당한다. 할당된 메모리에 어떤 값도 초기화되지 않고 클래스 객체에 대한 생성자나 소멸자를 호출하지 않는다.

3. 반환 타입

  • new: 할당된 타입에 맞는 포인터를 반환한다. 명시적인 형 변환이 필요없다.
  • malloc: 항상 void* 를 반환한다. 따라서 할당된 메모리를 특정 타입으로 사용하려면 명시적 형 변환 (int*)malloc(...) 이 필요하다.

4. 메모리 할당 실패 처리

  • new: 메모리 할당 실패 시 std::bad_alloc 예외를 발생시킨다. 예외 처리로 실패를 처리할 수 있다. 또는 new (std::nothorw) MyClass 와 같이 옵션을 사용하여 실패시 nullptr 를 반환하게 할 수 있다.
  • malloc: 실패 시 nullptr를 반환한다. 사용자가 명시적으로 NULL인지 확인하여 에러를 처리해야 한다.

5. 메모리 크기 지정

  • new: 할당할 타입만 지정하면 컴파일러가 해당 타입의 크기를 자동으로 계산하여 메모리를 할당한다.
  • malloc: 할당할 메모리의 크기를 바이트 단위로 직접 지정해야 한다. malloc(sizeof(int))

6. 배열 할당 및 해제

  • new: 배열을 할당할 때 new[] 연산자를 사용하고 해제할 때는 delete[] 를 사용한다.
  • malloc: 배열처럼 사용하기 위해 단순히 필요한 바이트 수만큼을 할당하고 포인터 연산을 통해 접근한다. 해제는 free 를 사용한다.

malloc 메모리 할당과 초기화 방법

malloc은 메모리를 할당만 하고 초기화는 하지 않는다. 따라서 메모리 할당과 동시에 초기화를 하려면 다른 함수를 이용해야 한다.
1. memset
memset은 이미 할당된 메모리 영역을 특정 값으로 초기화한다. 바이트 단위로 메모리를 채우기 때문에 각 요소를 다른 값으로 초기화하려면 반복문을 사용해야 한다.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
  int *arr;
  int size = 5;

  arr = (int*)malloc(size * sizeof(int));
  if (arr == NULL) {
    printf("메모리 할당 실패\n");
    return 1;
  }

  // arr을 0으로 초기화
  memset(arr, 0, size * sizeof(int));

  // 메모리 해제
  free(arr);
  return 0;
}
  1. calloc
    calloc은 메모리를 할당하고 0으로 초기화한다.
#include <stdio.h>
#include <stdlib.h>

int main() {
  int *arr;
  int size = 5;

  // calloc을 사용하여 메모리 할당 및 0으로 초기화
  arr = (int*)calloc(size, sizeof(int));
  if (arr == NULL) {
    printf("메모리 할당 실패\n");
    return 1;
  }
  free(arr);
  return 0;
}

0개의 댓글