std::unique_ptr<T,Deleter>::reset
From cppreference.com
< cpp | memory | unique ptr
| プライマリテンプレート unique_ptr<T> のメンバ |
||
void reset( pointer ptr = pointer() ) noexcept; |
(1) | (C++23 以降 constexpr) |
| 特殊化 unique_ptr<T[]> のメンバ |
||
template< class U > void reset( U ptr ) noexcept; |
(2) | (C++23 以降 constexpr) |
void reset( std::nullptr_t = nullptr ) noexcept; |
(3) | (C++23 以降 constexpr) |
管理オブジェクトを置き換えます。
1,2) auto old_ptr = get();
/* 格納されたポインタに “ptr” を代入 */
if (old_ptr)
get_deleter()(old_ptr); と同等です。
/* 格納されたポインタに “ptr” を代入 */
if (old_ptr)
get_deleter()(old_ptr); と同等です。
get_deleter()(old_ptr) が例外をスローする場合、未定義の動作となります。
2) このオーバーロードは、
U が pointer と同じ型であるか、または以下のすべての条件が満たされている場合にのみ、オーバーロード解決に参加します。-
pointerはelement_type*と同じ型です。 -
Uはポインタ型V*であり、V(*)[]がelement_type(*)[]に変換可能である。
3) reset(pointer()) と同等です。
目次 |
[編集] パラメータ
| ptr | - | 管理する新しいオブジェクトへのポインタ |
[編集] 注釈
管理オブジェクトを置き換え、同時に新しいデリータを提供するには、ムーブ代入演算子を使用できます。
自己リセット(つまり、ptr が *this によって既に管理されているオブジェクトを指しているかどうか)のテストは実行されません。ただし、コンパイラの拡張機能またはデバッグアサートとして提供されている場合を除きます。コード p.reset(p.release()) は自己リセットを伴いませんが、コード p.reset(p.get()) は自己リセットを伴います。
[編集] 例
このコードを実行
#include <iostream> #include <memory> struct Foo // object to manage { Foo() { std::cout << "Foo...\n"; } ~Foo() { std::cout << "~Foo...\n"; } }; struct D // deleter { 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...
[編集] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 2118 | C++11 | unique_ptr<T[]>::reset は限定変換を拒否しました |
受け入れ |
| LWG 2169 | C++11 | オーバーロード unique_ptr<T[]>::reset(pointer) が存在しました |
オーバーロードを削除しました |
[編集] 関連項目
| 管理対象オブジェクトへのポインタを返し、所有権を解放する (public メンバ関数) |