名前空間
変種
操作

std::unique_ptr<T,Deleter>::reset

提供: cppreference.com
< cpp‎ | memory‎ | unique ptr
 
 
ユーティリティライブラリ
汎用ユーティリティ
日付と時間
関数オブジェクト
書式化ライブラリ (C++20)
(C++11)
関係演算子 (C++20で非推奨)
整数比較関数
(C++20)
スワップと型操作
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
一般的な語彙の型
(C++11)
(C++17)
(C++17)
(C++17)
(C++17)

初等文字列変換
(C++17)
(C++17)
 
動的メモリ管理
スマートポインタ
(C++11)
(C++11)
(C++11)
(C++17未満)
(C++11)
アロケータ
メモリリソース
未初期化記憶域
ガベージコレクションサポート
その他
(C++20)
(C++11)
(C++11)
C のライブラリ
低水準のメモリ管理
 
 
プライマリテンプレート unique_ptr<T> のメンバ
void reset( pointer ptr = pointer() ) noexcept;
(1)
特殊化 unique_ptr<T[]> のメンバ
void reset( pointer ptr = pointer() ) noexcept;
(2) (C++17未満)
(3)
template< class U >
void reset( U ) = delete;
(C++17未満)
template< class U >
void reset( U ) noexcept;
(C++17以上)
(4)
void reset( std::nullptr_t p ) noexcept;
(C++17未満)
void reset( std::nullptr_t p = nullptr ) noexcept;
(C++17以上)

管理対象オブジェクトを置き換えます。

1) *this の管理対象のポインタを current_ptr とすると、以下のアクションをこの順番で行います。
  1. 現在のポインタのコピーを保存します old_ptr = current_ptr
  2. 現在のポインタを引数で上書きします current_ptr = ptr
  3. 古いポインタが空でなければ、以前の管理対象オブジェクトを削除します if(old_ptr != nullptr) get_deleter()(old_ptr).
2) プライマリテンプレートの reset メンバと同じように動作します。
3) 動的配列に対する特殊化 std::unique_ptr<T[]> に対して、派生型を指すポインタで reset が使用される (配列では未定義動作になります) ことを防ぐために、このテンプレートメンバが提供されます。
4) 動的配列に対する特殊化 std::unique_ptr<T[]> に対して、 nullptr で reset を使用できるように、このオーバーロードが必要です (そうでなければテンプレートオーバーロードによって禁止されます)。 reset(pointer()) と同等です。
(C++17未満)
3) プライマリテンプレートの reset メンバと同じように動作しますが、以下のいずれかの場合にのみ、オーバーロード解決に参加します。
  1. Upointer と同じ型である
  2. pointerelement_type* と同じ型であり、 U が何らかのポインタ型 V* であり、 V(*)[]element_type(*)[] に変換可能である
4) reset(pointer()) と同等です。
(C++17以上)

目次

[編集] 引数

ptr - 管理する新しいオブジェクトを指すポインタ

[編集] 戻り値

(なし)

[編集] ノート

管理対象オブジェクトを置き換えると同時に新しいデリータを供給するためには、ムーブ代入演算子を使用できます。

自己リセット、つまり ptr が指しているオブジェクトがすでに *this の管理対象かどうか、の確認は行われません (コンパイラの拡張やデバッグアサートとして提供されることはあります)。 ちなみに p.reset(p.release()) のようなコードは自己リセットに含まれません。 p.reset(p.get()) のようなコードのみが問題となります。

[編集]

#include <iostream>
#include <memory>
 
struct Foo {
    Foo() { std::cout << "Foo...\n"; }
    ~Foo() { std::cout << "~Foo...\n"; }
};
 
struct D {
    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...

[編集] 関連項目

管理対象オブジェクトへのポインタを返し、所有権を解放します
(パブリックメンバ関数) [edit]