|
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
| Modifiers | ||||
unique_ptr::reset | ||||
| Observers | ||||
| Non-member functions | ||||
(C++14)(C++20) | ||||
(until C++20)(C++20) | ||||
(C++20) | ||||
| Helper classes | ||||
members of the primary template, unique_ptr<T> | ||
void reset( pointer ptr= pointer())noexcept; | (1) | (constexpr since C++23) |
members of the specialization unique_ptr<T[]> | ||
template<class U> void reset( U ptr)noexcept; | (2) | (constexpr since C++23) |
void reset(std::nullptr_t= nullptr)noexcept; | (3) | (constexpr since C++23) |
Replaces the managed object.
U is the same type aspointer, or all following conditions are satisfied:pointer is the same type aselement_type*.U is a pointer typeV* such thatV(*)[] is convertible toelement_type(*)[].Contents |
| ptr | - | pointer to a new object to manage |
To replace the managed object while supplying a new deleter as well, move assignment operator may be used.
A test for self-reset, i.e. whetherptr points to an object already managed by*this, is not performed, except where provided as a compiler extension or as a debugging assert. Note that code such asp.reset(p.release()) does not involve self-reset, only code likep.reset(p.get()) does.
#include <iostream>#include <memory> struct Foo// object to manage{ Foo(){std::cout<<"Foo...\n";} ~Foo(){std::cout<<"~Foo...\n";}}; struct D// deleter{void operator()(Foo* p){std::cout<<"Calling delete for Foo object...\n"; delete p;}}; int main(){std::cout<<"Creating new Foo...\n";std::unique_ptr<Foo, D> up(new Foo(), D());// up owns the Foo pointer (deleter D) std::cout<<"Replace owned Foo with a new Foo...\n"; up.reset(new Foo());// calls deleter for the old one std::cout<<"Release and delete the owned Foo...\n"; up.reset(nullptr);}
Output:
Creating new Foo...Foo...Replace owned Foo with a new Foo...Foo...Calling delete for Foo object...~Foo...Release and delete the owned Foo...Calling delete for Foo object...~Foo...
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 2118 | C++11 | unique_ptr<T[]>::reset rejected qualification conversions | accepts |
| LWG 2169 | C++11 | the overloadunique_ptr<T[]>::reset(pointer) existed | removed the overload |
| returns a pointer to the managed object and releases the ownership (public member function)[edit] |