最終更新日時(UTC):
が更新

履歴 編集

function
<memory>

std::unique_ptr::reset(C++11)

void reset(pointer p = pointer()) noexcept;   // (1)

// 配列版のみ
void reset(nullptr_t p) noexcept;             // (2) C++14まで
void reset(nullptr_t = nullptr) noexcept;     // (2) C++17

template <class U> void reset(U) = delete;    // (3) C++14まで
template <class U> void reset(U p) noexcept;  // (3) C++17

概要

リソースの所有権を放棄し、新たなリソースの所有権を設定する。

効果

  • (1) : 保持しているポインタ変数にpを代入する。デフォルト引数を使用する場合、この関数を呼び出したあと*thisはリソースを保持していない状態になる。 代入前に保持していたポインタ変数をold_pとし、それがnullptrでなければ、get_deleter()(old_p)によって、保持していたポインタを解放する。

  • (2) :

    • reset(pointer())と等価の効果を持つ。
  • (3) :

    • C++14まで : 他のポインタ型からpointer型への変換を禁止する。
    • C++17 : (1)と等価、ただし以下のどちらかの場合にのみオーバーロード解決に参加する。
      • Uはメンバ型pointerと同じ型
      • pointerelement_type*と同じ型かつUは何らかのポインタ型V*であり、V(*)[]element_type(*)[]に変換可能である

戻り値

なし

#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;
}

出力

p doesn't have resource
2

バージョン

言語

  • C++11

処理系

  • GCC: 4.4.7
  • Clang libc++, C++11 mode: 3.0
  • ICC: ?
  • Visual C++: 2010, 2012, 2013
    • 2012までは、delete宣言に対応していないため、代わりにprivateで宣言のみ行う手法で代用されている。

参照