- Primary Template, unique_ptr<T>
- Specialization for Arrays, unique_ptr<T[]>
- C++23
- C++11
// 1)
constexpr void reset( pointer ptr = pointer() ) noexcept;
// 1)
void reset( pointer ptr = pointer() ) noexcept;
- C++23
- C++11
// 2)
template< class U >
constexpr void reset( U ptr ) noexcept;
// 3)
constexpr void reset( std::nullptr_t = nullptr ) noexcept;
// 2)
template< class U >
void reset( U ptr ) noexcept;
// 3)
void reset( std::nullptr_t = nullptr ) noexcept;
Description
Replaces the managed object.
1)
Given current_ptr
, the pointer that was managed by *this
, performs the following actions, in this order:
- Saves a copy of the current pointer
old_ptr
=current_ptr
- Overwrites the current pointer with the argument
current_ptr
=ptr
- If the old pointer was non-empty, deletes the previously managed object
if(old_ptr) get_deleter()(old_ptr)
.
2)
Behaves the same as the reset member of the primary template, except that it will only participate in overload resolution if either
U
is the same type as pointer, or- pointer is the same type as
element_type*
andU
is a pointer typeV*
such thatV(*)[]
is convertible toelement_type(*)[]
.
3)
Equivalent to reset(pointer())
Parameters
ptr
- pointer to a new object to manage
Return value
(none)
Notes
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. whether ptr
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 as p.reset(p.release())
does not involve self-reset, only code like p.reset(p.get())
does.
Example
#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);
}
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...
Defect reports
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 |