차근차근 꾸준히

한 눈에 알기 쉽게 정리하자

프로그래밍/C++

[C++] Operator new, malloc, memset 에 대해

shintesh 2025. 1. 15. 15:57
 

new 및 delete 연산자

C++ 언어의 new 및 delete 연산자를 사용하면 할당을 제어할 수 있습니다.

learn.microsoft.com

마소의 new, delete 연산자에 대한 학습을 하다가 생긴 의문을 정리했다.


[목차]

 

1. Operator new

개요:

  • C++에서 동적 메모리 할당을 위해 사용하는 연산자입니다.
  • 객체를 생성할 때 호출되며, **생성자(Constructor)**도 자동으로 호출합니다.

특징:

  • new 키워드를 사용하여 호출됩니다.
  • 메모리를 할당하고, 할당된 메모리 주소를 반환합니다.
  • 기본적으로 operator new는 메모리 할당에 실패하면 std::bad_alloc 예외를 던집니다.

사용 예제:

int* ptr = new int(42);  // 정수형 메모리를 할당하고, 42로 초기화
std::cout << *ptr << std::endl;  // 출력: 42
delete ptr;  // 메모리 해제

 

커스터 마이징:
operator new를 오버로딩하여 메모리 할당 동작을 변경할 수 있습니다.

void* operator new(size_t size) {
    std::cout << "Custom new operator called for size: " << size << std::endl;
    return malloc(size);  // 내부적으로 malloc을 호출
}

 

 

2. malloc

개요:

  • C언어에서 제공하는 메모리 할당 함수이며, C++에서도 사용할 수 있습니다.
  • 힙(heap) 메모리에서 지정된 크기만큼 할당하며, 반환값은 void*입니다.

특징:

  • 초기화하지 않음: 할당된 메모리는 초기화되지 않습니다.
  • 할당된 메모리는 반드시 **free**를 사용하여 해제해야 합니다.
  • C++ 객체를 생성할 때는 생성자가 호출되지 않음.

사용 예시:

int* ptr = (int*)malloc(sizeof(int));
*ptr = 42;  // 메모리 초기화
std::cout << *ptr << std::endl;  // 출력: 42
free(ptr);  // 메모리 해제

차이점 (vs operator new):

  • malloc은 예외를 던지지 않고, 실패 시 NULL을 반환합니다.
  • 객체 생성 및 소멸자의 호출이 없습니다.

 

 

3. memset

개요:

  • C언어에서 제공하는 함수로, 메모리를 특정 값으로 초기화하는 데 사용됩니다.
  • C++에서도 사용 가능하며, 주로 초기화클리어 목적으로 사용됩니다.

특징:

  • 메모리의 모든 바이트를 지정된 값으로 설정합니다.
  • 초기화 값은 바이트 단위로 설정되므로, 0으로 초기화할 때 주로 사용됩니다.

사용 예시:

#include <cstring>  // memset 사용을 위해 필요

int arr[5];
memset(arr, 0, sizeof(arr));  // 배열을 0으로 초기화

for (int i = 0; i < 5; ++i) {
    std::cout << arr[i] << " ";  // 출력: 0 0 0 0 0
}

주의점:

  • 객체 초기화에는 적합하지 않으며, POD (Plain Old Data) 타입에서만 안전하게 사용할 수 있습니다.

요약 비교:

특성 operator new malloc memset
용도 동적 메모리 할당 + 생성자 호출 동적 메모리 할당 메모리 초기화
초기화 여부 가능 (생성자 호출) 불가능 특정 값으로 초기화
해제 방식 delete free 해제 불필요
예외 처리 std::bad_alloc 예외 발생 실패 시 NULL 반환 없음
객체 지원 O X X

각 메모리 관리 방식은 상황에 따라 적합하게 선택해 사용해야 합니다. C++에서는 new/delete를 주로 사용하며, malloc과 memset은 저수준 메모리 작업이나 특정 요구사항이 있을 때 활용됩니다.

'프로그래밍 > C++' 카테고리의 다른 글

[C++] constexpr에 대해서  (0) 2024.12.27
[C++] static에 대해서  (0) 2024.12.27