- 主模板,unique_ptr<T>
- 数组特化,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;
描述
替换托管对象。
1)
给定 `current_ptr`(即 `*this` 所托管的指针),按以下顺序执行操作:
- 保存当前指针的副本 `old_ptr` = `current_ptr`
- 用参数覆盖当前指针 `current_ptr` = `ptr`
- 如果旧指针非空,则删除先前托管的对象 `if(old_ptr) get_deleter()(old_ptr)`。
2)
其行为与主模板的 reset 成员相同,但仅当以下任一情况发生时,它才会参与重载解析:
- `U` 与指针类型相同,或者
- 指针类型与 `element_type*` 类型相同,并且 `U` 是一个指针类型 `V*`,使得 `V(*)[]` 可转换为 `element_type(*)[]`。
3)
等同于 reset(pointer())
参数
`ptr` - 指向新对象的指针,用于托管
返回值
(无)
备注
要替换托管对象并同时提供新的删除器,可以使用移动赋值运算符。
不会执行对自重置的检查,即 `ptr` 是否指向 `*this` 已托管的对象,除非作为编译器扩展或调试断言提供。请注意,诸如 `p.reset(p.release())` 之类的代码不涉及自重置,只有像 `p.reset(p.get())` 这样的代码才会。
示例
#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...
缺陷报告
以下改变行为的缺陷报告已追溯应用于先前发布的 C++ 标准。
DR | 应用于 | 发布时的行为 | 正确行为 |
---|---|---|---|
LWG 2118 | C++11 | unique_ptr<T[]>::reset 拒绝了限定符转换 | 接受 |