std::destroy_at - cppreference.com
De cppreference.com
</tbody> <tbody class="t-dcl-rev "> </tbody><tbody>
| Definido en el archivo de encabezado |
||
|
|
(desde C++17) (hasta C++20) |
|
|
|
(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.
#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