名前空間
変種
操作

std::unique_ptr::reset

提供: cppreference.com
< cpp‎ | memory‎ | unique ptr
 
 
 
動的メモリ管理
未初期化記憶域
(C++17)
ガベージコレクションサポート
その他
(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]