Namespaces
Variants

std:: destroy_at

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 >
void destroy_at ( T * p ) ;
(C++17부터)
(C++20부터 constexpr)

만약 T 가 배열 타입이 아닌 경우, p 가 가리키는 객체의 소멸자를 호출합니다. 마치 p - > ~T ( ) 와 같이 수행됩니다.

만약 T 가 배열 타입인 경우, 프로그램의 형식이 올바르지 않음 (C++20 이전) * p 의 요소들을 순서대로 재귀적으로 파괴하며, 마치 std:: destroy ( std:: begin ( * p ) , std:: end ( * p ) ) 를 호출하는 것과 같음 (C++20 이후) .

목차

매개변수

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(); }

참고 사항

destroy_at 는 파괴할 객체의 타입을 추론하여 소멸자 호출 시 명시적으로 작성하는 것을 피합니다.

destroy_at 이 어떤 상수 표현식 e 의 평가 중에 호출될 때, 인수 p 는 수명이 e 의 평가 내에서 시작된 객체를 가리켜야 합니다.

(C++20부터)

예제

다음 예제는 destroy_at 을 사용하여 연속된 요소 시퀀스를 파괴하는 방법을 보여줍니다.

#include <iostream>
#include <memory>
#include <new>
struct Tracer
{
    int value;
    ~Tracer() { std::cout << value << " destructed\n"; }
};
int main()
{
    alignas(Tracer) unsigned char buffer[sizeof(Tracer) * 8];
    for (int i = 0; i != 8; ++i)
        new(buffer + sizeof(Tracer) * i) Tracer{i}; // manually construct objects
    auto ptr = std::launder(reinterpret_cast<Tracer*>(buffer));
    for (int i = 0; i != 8; ++i)
        std::destroy_at(ptr + i);
}

출력:

0 destructed
1 destructed
2 destructed
3 destructed
4 destructed
5 destructed
6 destructed
7 destructed

참고 항목

(C++17)
객체 범위를 파괴함
(function template)
(C++17)
범위 내 지정된 개수의 객체를 파괴함
(function template)
주어진 주소에 객체를 생성함
(function template)
주어진 주소의 객체를 파괴함
(algorithm function object)