std:: default_delete
|
헤더 파일에 정의됨
<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
의 특수화들은 빈 클래스이며,
빈 기반 클래스 최적화
에 사용됩니다.
default_delete
는 단일 객체에 대한 메모리를 해제하기 위해
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) |
std::default_delete
객체를 생성합니다.
std::default_delete
객체로부터
std::default_delete<T>
객체를 생성합니다.
U*
가
T*
로 암시적으로 변환 가능할 때만 오버로드 해결에 참여합니다.
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) |
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)
|
고유 객체 소유권 의미론을 가진 스마트 포인터
(클래스 템플릿) |