Namespaces
Variants

std:: default_delete

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
헤더 파일에 정의됨 <memory>
template < class T > struct default_delete ;
(1) (C++11부터)
template < class T > struct default_delete < T [ ] > ;
(2) (C++11부터)

std::default_delete 는 삭제자가 지정되지 않았을 때 std::unique_ptr 이 사용하는 기본 삭제 정책입니다. 일반적인 구현에서 default_delete 의 특수화들은 빈 클래스이며, 빈 기반 클래스 최적화 에 사용됩니다.

1) 비특수화된 default_delete 는 단일 객체에 대한 메모리를 해제하기 위해 delete 를 사용합니다.
2) 배열 타입에 대한 부분 특수화도 제공되며, 이는 delete [ ] 를 사용합니다.

목차

멤버 함수

(constructor)
default_delete 객체를 생성합니다
(public member function)
operator()
객체 또는 배열을 삭제합니다
(public member function)

std::default_delete:: default_delete

constexpr default_delete ( ) noexcept = default ;
(1)
기본 템플릿 특수화
template < class U >
default_delete ( const default_delete < U > & d ) noexcept ;
(2) (C++11부터)
(C++23부터 constexpr)
배열 특수화
template < class U >
default_delete ( const default_delete < U [ ] > & d ) noexcept ;
(3) (C++11부터)
(C++23부터 constexpr)
1) std::default_delete 객체를 생성합니다.
2) 다른 std::default_delete 객체로부터 std::default_delete<T> 객체를 생성합니다.
이 오버로드는 U* T* 로 암시적으로 변환 가능할 때만 오버로드 해결에 참여합니다.
3) 다른 std::default_delete<U[]> 객체로부터 std::default_delete<T[]> 객체를 생성합니다.
이 오버로드는 U(*)[ T(*)[ 로 암시적으로 변환 가능할 때만 오버로드 해결에 참여합니다.

매개변수

d - 복사할 삭제자

참고 사항

std::default_delete 의 변환 생성자 템플릿은 std:: unique_ptr < Derived > 에서 std:: unique_ptr < Base > 로의 암시적 변환을 가능하게 합니다.

std::default_delete:: operator()

기본 템플릿 특수화
void operator ( ) ( T * ptr ) const ;
(1) (C++11부터)
(C++23부터 constexpr)
배열 특수화
template < class U >
void operator ( ) ( U * ptr ) const ;
(2) (C++11부터)
(C++23부터 constexpr)
1) delete ptr 에 호출합니다.
2) delete [ ] ptr 에 호출합니다.
이 오버로드는 U(*)[] T(*)[] 로 암시적으로 변환 가능할 때만 오버로드 해결에 참여합니다.
U 가 불완전한 타입인 경우 프로그램은 ill-formed입니다.

매개변수

ptr - 삭제할 객체 또는 배열

예외

예외 보장 없음.

불완전 타입에 대한 호출

코드의 해당 지점에서 operator ( ) 가 호출될 때, 타입은 완전히 정의되어 있어야 합니다. 일부 구현에서는 이 경우를 보장하기 위해 static_assert 가 사용됩니다. 이 요구사항의 이유는 불완전한 타입에 대해 delete 를 호출하는 것이 C++에서 미정의 동작이기 때문입니다. 특히 완전한 클래스 타입이 비트리비얼 소멸자나 할당 해제 함수를 가지고 있는 경우, 컴파일러는 이러한 함수들이 존재하고 호출되어야 하는지 알 수 있는 방법이 없기 때문입니다.

참고 사항

기능 테스트 매크로 표준 기능
__cpp_lib_constexpr_memory 202202L (C++23) constexpr 생성자와 operator ( )

예제

#include <algorithm>
#include <memory>
#include <vector>
int main()
{
//  {
//      std::shared_ptr<int> shared_bad(new int[10]);
//  } // 소멸자가 delete를 호출, 정의되지 않은 동작
    {
        std::shared_ptr<int> shared_good(new int[10], std::default_delete<int[]>());
    } // OK: 소멸자가 delete[]를 호출
    {
        std::unique_ptr<int> ptr(new int(5));
    } // unique_ptr<int> uses default_delete<int>
    {
        std::unique_ptr<int[]> ptr(new int[10]);
    } // unique_ptr<int[]> uses default_delete<int[]>
    // default_delete는 delete 함수 객체가 필요한 모든 곳에서 사용 가능
    std::vector<int*> v;
    for (int n = 0; n < 100; ++n)
        v.push_back(new int(n));
    std::for_each(v.begin(), v.end(), std::default_delete<int>());
}

결함 보고서

다음의 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
LWG 2118 C++11 array 특수화의 멤버 함수들이 qualification 변환을 거부함 허용

참고 항목

(C++11)
고유 객체 소유권 의미론을 가진 스마트 포인터
(클래스 템플릿)