new_operator_delete

new_operator_delete (operator delete)

<new> 헤더에 정의되어 있어요. 메모리 해제를 수행하는 대체 가능한(replaceable) 일반 해제 함수들이에요. delete 표현식이 이 함수들을 호출해요.

출처: cppreference

본문

대체 가능한 일반 해제 함수:

void operator delete  ( void* ptr ) throw();                     // (1) until C++11
void operator delete  ( void* ptr ) noexcept;                    // (1) since C++11
void operator delete[]( void* ptr ) throw();                     // (2) until C++11
void operator delete[]( void* ptr ) noexcept;                    // (2) since C++11
void operator delete  ( void* ptr, std::align_val_t al ) noexcept;  // (3) since C++17
void operator delete[]( void* ptr, std::align_val_t al ) noexcept;  // (4) since C++17
void operator delete  ( void* ptr, std::size_t sz ) noexcept;    // (5)
void operator delete[]( void* ptr, std::size_t sz ) noexcept;    // (6)
void operator delete  ( void* ptr, std::size_t sz, std::align_val_t al ) noexcept;  // (7) since C++17
void operator delete[]( void* ptr, std::size_t sz, std::align_val_t al ) noexcept;  // (8) since C++17
  • (1)(2) delete/delete[]가 사용하는 가장 기본적인 해제 함수. ptr이 널이면 아무 것도 하지 않아요.
  • (3)(4) 과정렬(over-aligned) 객체를 해제할 때 정렬 인자 al을 받는 형태. C++17.
  • (5)(6) sized deallocation. 크기 sz를 받는 형태로, 비-배열·배열 해제에 쓰여요. sized delete는 컴파일러가 크기를 알 수 있을 때 더 효율적으로 해제할 수 있어요.
  • (7)(8) sized + aligned 형태. C++17.

operator delete/operator delete[]는 전역으로 정의되어 있고, 사용자가 대체(replace)할 수 있어요. 대체 버전은 메모리를 실제로 해제하는 작업을 수행해요. delete는 소멸자를 호출한 뒤 이어서 해제 함수를 호출해요.

// 사용자 정의 전역 해제 함수 (진단 프린트)
void operator delete(void* ptr) noexcept
{
    std::cerr << "delete 호출됨\n";
    std::free(ptr);
}

주의 (Notes)

  • placement delete 형태(추가 인자를 받는 비-대체 오버로드)도 있어요.
  • sz 버전(sized)이 구현에 제공되면 delete는 소멸자 호출 이후 크기 정보를 전달할 수 있어 컴파일러 최적화에 유리해요.

더 알아보기 (Learn more)

cppreference