|
|
Defined in header <memory> | ||
template<class T> void destroy_at( T* p); | (since C++17) (constexpr since C++20) | |
IfT
is not an array type, calls the destructor of the object pointed to byp, as if byp->~T().
IfT
is an array type,the program is ill-formed(until C++20)recursively destroys elements of*p in order, as if by callingstd::destroy(std::begin(*p),std::end(*p))(since C++20).
Contents |
p | - | a pointer to the object to be destroyed |
template<class T>constexprvoid destroy_at(T* p){ifconstexpr(std::is_array_v<T>)for(auto& elem:*p)(destroy_at)(std::addressof(elem));else p->~T();}// C++17 version:// template<class T> void destroy_at(T* p) { p->~T(); } |
destroy_at
deduces the type of object to be destroyed and hence avoids writing it explicitly in the destructor call.
When | (since C++20) |
The following example demonstrates how to usedestroy_at
to destroy a contiguous sequence of elements.
#include <iostream>#include <memory>#include <new> struct Tracer{int value; ~Tracer(){std::cout<< value<<" destructed\n";}}; int main(){ alignas(Tracer)unsignedchar 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);}
Output:
0 destructed1 destructed2 destructed3 destructed4 destructed5 destructed6 destructed7 destructed
(C++17) | destroys a range of objects (function template)[edit] |
(C++17) | destroys a number of objects in a range (function template)[edit] |
(C++20) | creates an object at a given address (function template)[edit] |
(C++20) | destroys an object at a given address (algorithm function object)[edit] |