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
-
- 특수화되지 않은
default_delete는delete로 단일 객체의 메모리를 해제해요.
- 특수화되지 않은
-
- 배열 타입에 대한 부분 특수화로,
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) 배열 특수화
-
ptr을delete해요.
-
ptr을delete[]해요.
T가 불완전 타입이면 (1)의 동작은 제한되고, (2)는 T가 완전 타입일 때만 잘 정의돼요. std::unique_ptr이 default_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[])