Namespaces
Variants

std::destroy_at

De es.cppreference.net
 
 
Biblioteca de algoritmos
Algoritmos restringidos y algoritmos sobre rangos (C++20)
Algoritmos restringidos, por ejemplo, ranges::copy, ranges::sort, ...
Operaciones de secuencia no modificadoras    
Operaciones por lotes
(C++17)
Operaciones de búsqueda
Operaciones de secuencia modificadoras
Operaciones de copia
(C++11)
(C++11)
Operaciones de intercambio
Operaciones de transformación
Operaciones de generación
Operaciones de eliminación
Operaciones de cambio de orden
(hasta C++17)(C++11)
(C++20)(C++20)
Operaciones de muestreo
(C++17)

Ordenamiento y operaciones relacionadas
Operaciones de particionamiento
(C++11)    

Operaciones de ordenamiento
Operaciones de búsqueda binaria
(en rangos particionados)
Operaciones de conjunto (en rangos ordenados)
Operaciones de fusión (en rangos ordenados)
Operaciones de montículo
Operaciones de mínimo/máximo
(C++11)
(C++17)
Operaciones de comparación lexicográfica
Operaciones de permutación


 
 
Definido en el encabezado <memory>
template< class T >
void destroy_at( T* p );
(desde C++17)
(hasta C++20)
template< class T >
constexpr void destroy_at( T* p );
(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 array, el programa está mal formado(hasta C++20)destruye recursivamente los elementos de *p en orden, como si llamara a std::destroy(std::begin(*p), std::end(*p))(desde C++20).

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

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) * 4];
    
    for (int i = 0; i < 4; ++i)
        new (buffer + sizeof(Tracer) * i) Tracer{i}; // manually construct objects

    auto ptr = std::launder(reinterpret_cast<Tracer*>(buffer));

    for (int i = 0; i < 4; ++i)
        std::destroy_at(ptr + i);
}

Salida:

0 destructed
1 destructed
2 destructed
3 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)