跳到主要内容
// 1)
constexpr void reset( pointer ptr = pointer() ) 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 2118C++11unique_ptr<T[]>::reset 拒绝了限定符转换接受
// 1)
constexpr void reset( pointer ptr = pointer() ) 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 2118C++11unique_ptr<T[]>::reset 拒绝了限定符转换接受