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는 소멸자 호출 이후 크기 정보를 전달할 수 있어 컴파일러 최적화에 유리해요.