Espacios de nombres
Variantes

std::destroy_at

De cppreference.com
 
 
Biblioteca de servicios
 
Gestión de memoria dinámica
Punteros inteligentes
(C++11)
(C++11)
(C++11)
(hasta C++17)
(C++11)
(C++23)
Asignadores de memoria
Recursos de memoria
Almacenamiento no inicializado
Algoritmos de memoria no inicializada
Algoritmos restringidos de memoria no inicializada
Apoyo para recolección de basura
(C++11)(hasta C++23)
(C++11)(hasta C++23)
(C++11)(hasta C++23)
(C++11)(hasta C++23)
(C++11)(hasta C++23)
(C++11)(hasta C++23)
Misceláneos
(C++20)
(C++11)
(C++11)
 
<tbody> </tbody> <tbody class="t-dcl-rev "> </tbody><tbody> </tbody>
Definido en el archivo de 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 al que apunta p, como si fuera por 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 fuera llamando a std::destroy(std::begin(*p), std::end(*p)) (desde C++20).

Parámetros

p - Un puntero al objeto a ser destruido.

Valor de retorno

(Ninguno)

Posible implementación

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

Notas

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

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

(desde C++20)

Ejemplo

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

#include <memory>
#include <new>
#include <iostream>

struct Trazador {
    int value;
    ~Trazador() { std::cout << value << " destruido\n"; }
};

int main()
{
    alignas(Trazador) unsigned char buffer[sizeof(Trazador) * 8];
    
    for (int i = 0; i < 8; ++i)
        new(buffer + sizeof(Trazador) * i) Trazador{i}; // construir objetos manualmente

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

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

Salida:

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

Véase también

(C++17)
Destruye un rango de objetos.
(plantilla de función) [editar]
(C++17)
Destruye un número de objetos en un rango.
(plantilla de función) [editar]
Crea un objeto en una dirección dada
(plantilla de función) [editar]
Destruye un objeto en una dirección dada.
(niebloid) [editar]