• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

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

    履歴 編集

    function
    <memory>

    std::unique_ptr::reset

    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と同じ型
        • 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: 3.0
    • ICC: ?
    • Visual C++: 2010 , 2012 , 2013
      • 2012までは、delete宣言に対応していないため、代わりにprivateで宣言のみ行う手法で代用されている。

    参照