Namespaces
Variants

std::unique_ptr<T,Deleter>:: reset

From ja.cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
プライマリテンプレート 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 ) ;
。
get_deleter get_deleter ( ) ( old_ptr ) が例外をスローした場合、動作は未定義です。
2) このオーバーロードは、以下のいずれかの条件が満たされる場合にのみオーバーロード解決に参加します:
  • 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 // 管理対象オブジェクト
{
    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) が存在していた オーバーロードを削除

関連項目

管理対象オブジェクトへのポインタを返し、所有権を解放する
(公開メンバ関数)