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 형태의 추가 인자를 받는 오버로드도 따로 있어요.