- memory[meta header]
- std[meta namespace]
- unique_ptr[meta class]
- function[meta id-type]
- cpp11[meta cpp]
void reset(pointer p = pointer()) noexcept; // (1) C++11
constexpr void reset(pointer p = pointer()) noexcept; // (1) C++23
// 配列版のみ
void reset(nullptr_t p) noexcept; // (2) C++11
void reset(nullptr_t = nullptr) noexcept; // (2) C++17
constexpr void reset(nullptr_t = nullptr) noexcept; // (2) C++23
template <class U> void reset(U) = delete; // (3) C++11
template <class U> void reset(U p) noexcept; // (3) C++17
template <class U> constexpr void reset(U p) noexcept; // (3) C++23リソースを解放し、新たなリソースの所有権を設定する。
-
(1) : 保持しているポインタ変数に
pを代入する。デフォルト引数を使用する場合、この関数を呼び出したあと*thisはリソースを保持していない状態になる。 代入前に保持していたポインタ変数をold_pとし、それがnullptrでなければ、get_deleter()(old_p)によって、保持していたポインタを解放する。 -
(2) :
reset(pointer())と等価の効果を持つ。
-
(3) :
- C++14まで : 他のポインタ型から
pointer型への変換を禁止する。 - C++17 : (1)と等価、ただし以下のどちらかの場合にのみオーバーロード解決に参加する。
Uはメンバ型pointerと同じ型pointerはelement_type*と同じ型かつUは何らかのポインタ型V*であり、V(*)[]はelement_type(*)[]に変換可能である
- C++14まで : 他のポインタ型から
なし
#include <iostream>
#include <memory>
int main()
{
std::unique_ptr<int> p(new int(3));
// リソースを解放
p.reset();
if (!p) {
std::cout << "p doesn't have resource" << std::endl;
}
// リソースを再設定
p.reset(new int(2));
std::cout << *p << std::endl;
}- reset[color ff0000]
p doesn't have resource
2
- C++11
- GCC: 4.4.7 [mark verified]
- Clang: 3.0 [mark verified]
- ICC: ?
- Visual C++: 2010 [mark verified], 2012 [mark verified], 2013 [mark verified]
- 2012までは、delete宣言に対応していないため、代わりにprivateで宣言のみ行う手法で代用されている。
- LWG Issue 821. Minor cleanup :
unique_ptr- C++11で、配列版に
nullptr_tを受け取るオーバーロード(2)と、delete定義されたテンプレート版(3)が追加された。配列版では派生クラスのポインタを受け取ると要素サイズの不一致で誤ったdelete[]が行われるため、pointerに変換可能な他のポインタ型を受け付けないようにしたもの
- C++11で、配列版に
- N4089 Safe conversions in
unique_ptr<T[]>, revision 2 - P2273R3 Making
std::unique_ptrconstexpr - LWG Issue 998. Smart pointer referencing its owner
- C++11で、効果が「まず
pを格納ポインタへ代入し、その後で古いポインタに対して削除子を呼び出す」という順序で規定された。逆順だと、削除対象のオブジェクトが所有者であるunique_ptrを参照している場合に、破棄途中の状態を観測できてしまうため
- C++11で、効果が「まず
- LWG Issue 2169. Missing
reset()requirements inunique_ptrspecialization