std::destroy_at
De cppreference.com
<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 |
(desde C++20) |
Ejemplo
El siguiente ejemplo demuestra cómo usar destroy_at para destruir una secuencia contigua de elementos.
Ejecuta este código
#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) |
(C++17) |
Destruye un número de objetos en un rango. (plantilla de función) |
(C++20) |
Crea un objeto en una dirección dada (plantilla de función) |
(C++20) |
Destruye un objeto en una dirección dada. (niebloid) |