std::unique_ptr<T,Deleter>:: reset
|
プライマリテンプレート 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) |
管理対象オブジェクトを置き換えます。
/* 格納されたポインタに「ptr」を代入 */
if ( old_ptr )
get_deleter ( ) ( old_ptr ) ; 。
get_deleter
get_deleter
(
)
(
old_ptr
)
が例外をスローした場合、動作は未定義です。
-
pointerがelement_type*と同じ型である場合 -
Uがポインタ型V*であり、V(*)[]がelement_type(*)[]に変換可能である場合
目次 |
パラメータ
| 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がFooポインタを所有(デリーターD) std::cout << "Replace owned Foo with a new Foo...\n"; up.reset(new Foo()); // 古いオブジェクトに対してデリーターを呼び出す 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)
が存在していた
|
オーバーロードを削除 |
関連項目
|
管理対象オブジェクトへのポインタを返し、所有権を解放する
(公開メンバ関数) |