std::unique_ptr<T,Deleter>::reset
提供: cppreference.com
< cpp | memory | unique ptr
プライマリテンプレート 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
とすると、以下のアクションをこの順番で行います。
- 現在のポインタのコピーを保存します old_ptr = current_ptr
- 現在のポインタを引数で上書きします current_ptr = ptr
- 古いポインタが空でなければ、以前の管理対象オブジェクトを削除します 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 メンバと同じように動作しますが、以下のいずれかの場合にのみ、オーバーロード解決に参加します。
4) reset(pointer()) と同等です。
|
(C++17以上) |
目次 |
[編集] 引数
ptr | - | 管理する新しいオブジェクトを指すポインタ |
[編集] 戻り値
(なし)
[編集] ノート
管理対象オブジェクトを置き換えると同時に新しいデリータを供給するためには、ムーブ代入演算子を使用できます。
自己リセット、つまり ptr
が指しているオブジェクトがすでに *this
の管理対象かどうか、の確認は行われません (コンパイラの拡張やデバッグアサートとして提供されることはあります)。 ちなみに p.reset(p.release()) のようなコードは自己リセットに含まれません。 p.reset(p.get()) のようなコードのみが問題となります。
[編集] 例
Run this code
#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...
[編集] 関連項目
管理対象オブジェクトへのポインタを返し、所有権を解放します (パブリックメンバ関数) |