memory_destroy_at
memory_destroy_at (std::destroy_at)
<memory> 헤더에 정의되어 있어요. 주어진 포인터가 가리키는 객체의 소멸자를 호출해요. std::allocator_traits::destroy의 핵심 구현이에요. C++17부터 도입됐어요.
출처: cppreference
본문
template< class T >
void destroy_at( T* p ); // since C++17, until C++20
template< class T >
constexpr void destroy_at( T* p ); // since C++20
T가 배열 타입이 아니면 p가 가리키는 객체의 소멸자를 p->~T()로 호출해요.
T가 배열 타입이면, C++20 이전엔 ill-formed였고, C++20부터 *p의 요소들을 순서대로 std::destroy(std::begin(*p), std::end(*p))로 재귀적으로 파괴해요.
매개변수
p: 파괴할 객체에 대한 포인터
가능한 구현
template<class T>
constexpr void destroy_at(T* p)
{
if constexpr (std::is_array_v<T>)
for (auto &elem : *p)
(destroy_at)(std::addressof(elem));
else
p->~T();
}
// C++17 버전:
// template<class T> void destroy_at(T* p) { p->~T(); }
주의 (Notes)
destroy_at은 파괴할 객체의 타입을 추론하므로 소멸자 호출에서 타입을 명시적으로 쓰지 않아도 돼요.
destroy_at이 어떤 상수 표현식 e의 평가에서 호출되면, 인자 p는 e의 평가 안에서 수명이 시작된 객체를 가리켜야 해요. placement new로 만든 객체를 constexpr 문맥에서 파괴할 때 유용해요.
// placement new 로 구성한 객체 파괴
S* s = ::new (storage) S();
std::destroy_at(s); // s->~S() 호출