new_operator_new

new_operator_new (operator new)

<new> 헤더에 정의되어 있어요. 동적 메모리 할당을 수행하는 대체 가능한(replaceable) 할당 함수들이에요. new 표현식이 객체 저장 공간을 얻기 위해 이 함수들을 호출해요.

출처: cppreference

본문

대체 가능한 할당 함수:

void* operator new  ( std::size_t count );                    // (1)
void* operator new[]( std::size_t count );                    // (2)
void* operator new  ( std::size_t count, std::align_val_t al );  // (3) since C++17
void* operator new[]( std::size_t count, std::align_val_t al );  // (4) since C++17

대체 가능한 비-던지는(non-throwing) 할당 함수:

void* operator new  ( std::size_t count, const std::nothrow_t& tag );  // (5) noexcept since C++11
void* operator new[]( std::size_t count, const std::nothrow_t& tag );  // (6) noexcept since C++11
void* operator new  ( std::size_t count, std::align_val_t al, const std::nothrow_t& tag );  // (7) since C++17
void* operator new[]( std::size_t count, std::align_val_t al, const std::nothrow_t& tag );  // (8) since C++17
  • (1)(2) 기본 할당 함수. count 바이트의 저장 공간을 할당하려 시도해요. 성공하면 그 공간을 가리키는 널이 아닌 포인터를 돌려줘요.
  • (3)(4) 과정렬(over-aligned) 요구를 가진 객체를 위해 정렬 al을 받는 형태. C++17.
  • (5)-(8) 실패 시 예외를 던지지 않고 널을 돌려주는 비-던지는 형태. std::nothrow와 함께 쓰여요.

표준 구현에서 (1)(2)는 실패 시 std::bad_alloc을 던져요. (5)(6)은 실패 시 널을 돌려줘요.

// 사용자 정의 전역 할당 함수 (진단 + 실제 할당)
void* operator new(std::size_t n)
{
    std::cerr << "new " << n << " 바이트\n";
    if (void* p = std::malloc(n)) return p;
    throw std::bad_alloc();
}

new-표현식이 아닌, 클래스 전용 operator new를 정의해 특정 타입에 대해 커스텀 할당을 할 수도 있어요. placement new 형태의 추가 인자를 받는 오버로드도 따로 있어요.

더 알아보기 (Learn more)

cppreference