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)
Definido en el encabezado <memory>
template < class T >
void destroy_at ( T * p ) ;
(desde C++17)
(constexpr desde C++20)

Si T no es un tipo array, llama al destructor del objeto apuntado por p , como si fuera p - > ~T ( ) .

Si T es un tipo de arreglo, el programa está mal formado (hasta C++20) destruye recursivamente los elementos de * p en orden, como si se llamara a std:: destroy ( std:: begin ( * p ) , std:: end ( * p ) ) (desde C++20) .

Contenidos

Parámetros

p - un puntero al objeto que será destruido

Implementación posible

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(); 
}
// Versión C++17:
// template<class T> void destroy_at(T* p) { p->~T(); }

Notas

destroy_at deduce el tipo de objeto a destruir y por lo tanto evita escribirlo explícitamente en la llamada al destructor.

Cuando destroy_at es llamado en la evaluación de alguna expresión constante e , el argumento p debe apuntar a un objeto cuyo tiempo de vida comenzó dentro de la evaluación de e .

(since C++20)

Ejemplo

El siguiente ejemplo demuestra cómo usar destroy_at para destruir una secuencia contigua de elementos.

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

Salida:

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

Véase también

(C++17)
destruye un rango de objetos
(plantilla de función)
(C++17)
destruye una cantidad de objetos en un rango
(plantilla de función)
crea un objeto en una dirección dada
(plantilla de función)
destruye un objeto en una dirección dada
(objeto función de algoritmo)