memory_default_delete

memory_default_delete (std::default_delete)

<memory> 헤더에 정의되어 있어요. std::unique_ptr이 삭제자(deleter)를 지정하지 않았을 때 기본으로 사용하는 파괴 정책이에요. default_delete 특수화는 일반적인 구현에서 빈 클래스이며, empty base class optimization에 사용돼요. C++11부터 도입됐어요.

출처: cppreference

본문

template< class T > struct default_delete;      // (1) since C++11
template< class T > struct default_delete<T[]>; // (2) since C++11
    1. 특수화되지 않은 default_deletedelete로 단일 객체의 메모리를 해제해요.
    1. 배열 타입에 대한 부분 특수화로, delete[]를 사용해요.

멤버 함수

  • (생성자): default_delete 객체 생성 (공개 멤버 함수)
  • operator(): 객체 또는 배열 삭제 (공개 멤버 함수)

std::default_delete::default_delete

constexpr default_delete() noexcept = default;              // (1) 기본 템플릿 특수화

template< class U >
default_delete( const default_delete<U>& d ) noexcept;      // (2) since C++11, constexpr since C++23

배열 특수화에도 유사한 변환 생성자가 있어요. default_delete<U>에서 default_delete<T>로 변환 생성자는 포인터 변환이 유효한 경우에만 참여해요.

std::default_delete::operator()

void operator()( T* ptr ) const;   // (1) 기본 템플릿
void operator()( T* ptr ) const;   // (2) 배열 특수화
    1. ptrdelete해요.
    1. ptrdelete[]해요.

T가 불완전 타입이면 (1)의 동작은 제한되고, (2)는 T가 완전 타입일 때만 잘 정의돼요. std::unique_ptrdefault_delete를 기본 삭제자로 쓰므로, unique_ptr에는 std::default_delete가 유일한 파괴 정책으로 동작해요.

std::unique_ptr<int> up(new int(42));          // default_delete<int> 사용
std::unique_ptr<int[]> arr(new int[10]);       // default_delete<int[]> 사용 (delete[])

더 알아보기 (Learn more)

cppreference