std::unique_ptr<T,Deleter>::reset - cppreference.com
提供: cppreference.com
<tbody> </tbody> <tbody class="t-dcl-rev t-dcl-rev-num "> </tbody><tbody> </tbody> <tbody class="t-dcl-rev t-dcl-rev-num "> </tbody><tbody> </tbody>
| プライマリテンプレート unique_ptr<T> のメンバ |
||
|
|
(1) | |
| 特殊化 unique_ptr<T[]> のメンバ |
||
|
|
(2) | (C++17未満) |
| (3) | ||
|
|
(C++17未満) | |
|
|
(C++17以上) | |
| (4) | ||
|
|
(C++17未満) | |
|
|
(C++17以上) | |
管理対象オブジェクトを置き換えます。
1) *this の管理対象のポインタを current_ptr とすると、以下のアクションをこの順番で行います。
- 現在のポインタのコピーを保存します
old_ptr = current_ptr - 現在のポインタを引数で上書きします
current_ptr = ptr - 古いポインタが空でなければ、以前の管理対象オブジェクトを削除します
if(old_ptr != nullptr) get_deleter()(old_ptr).
|
2) プライマリテンプレートの reset メンバと同じように動作します。 3) 動的配列に対する特殊化 4) 動的配列に対する特殊化 |
(C++17未満) |
|
3) プライマリテンプレートの reset メンバと同じように動作しますが、以下のいずれかの場合にのみ、オーバーロード解決に参加します。
4) |
(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...