名前空間
変種
操作

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

From cppreference.com
< cpp‎ | memory‎ | unique ptr
 
 
メモリ管理ライブラリ
(説明用*)
未初期化メモリのアルゴリズム
(C++17)
(C++17)
(C++17)
制約付き未初期化
メモリアルゴリズム
Cライブラリ

アロケータ
メモリリソース
ガベージコレクションのサポート
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
(C++11)(C++23まで)
未初期化ストレージ
(C++20まで*)
(C++20まで*)
明示的な生存期間管理
 
 
プライマリテンプレート 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()(old_ptr) が例外をスローする場合、未定義の動作となります。
2) このオーバーロードは、Upointer と同じ型であるか、または以下のすべての条件が満たされている場合にのみ、オーバーロード解決に参加します。
  • pointerelement_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 メンバ関数) [編集]
English 日本語 中文(简体) 中文(繁體)