名前空間
変種
操作

std::weak_ptr

From cppreference.com
< cpp‎ | memory
 
 
メモリ管理ライブラリ
(説明用*)
未初期化メモリのアルゴリズム
(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まで*)
明示的な生存期間管理
 
 
ヘッダ <memory> で定義
template< class T > class weak_ptr;
(C++11以降)

std::weak_ptr は、std::shared_ptr によって管理されるオブジェクトに対する非所有(「弱い」)参照を保持するスマートポインタです。参照されるオブジェクトにアクセスするには、std::shared_ptr に変換する必要があります。

std::weak_ptr は一時的な所有権をモデル化します。オブジェクトが存在する場合にのみアクセスする必要があり、他の誰かによっていつでも削除される可能性がある場合、std::weak_ptr はオブジェクトを追跡するために使用され、一時的な所有権を取得するためにstd::shared_ptr に変換されます。この時点で元のstd::shared_ptr が破棄されても、一時的なstd::shared_ptr も破棄されるまでオブジェクトの寿命は延長されます。

std::weak_ptr のもう1つの用途は、std::shared_ptr によって管理されるオブジェクトによって形成される参照サイクルを解除することです。そのようなサイクルが孤立している場合(つまり、サイクル内に外部の共有ポインタがない場合)、shared_ptr の参照カウントはゼロにならず、メモリリークが発生します。これを防ぐために、サイクルのいずれかのポインタを弱くすることができます。

目次

[編集] メンバ型

メンバ型 定義
element_type

T

(C++17まで)

std::remove_extent_t<T>

(C++17以降)

[編集] メンバ関数

新しい weak_ptr を作成する
(public メンバ関数) [編集]
weak_ptr を破棄する
(public メンバ関数) [編集]
weak_ptr を代入する
(public メンバ関数) [編集]
変更
管理対象オブジェクトの所有権を解放する
(public メンバ関数) [編集]
管理対象オブジェクトを交換する
(public メンバ関数) [編集]
監視
オブジェクトを管理する shared_ptr オブジェクトの数を返す
(public メンバ関数) [編集]
参照されたオブジェクトが既に削除されたかどうかを確認する
(public メンバ関数) [編集]
参照されたオブジェクトを管理する shared_ptr を作成する
(public メンバ関数) [編集]
weak pointer の所有者ベースの順序付けを提供します
(public メンバ関数) [編集]
weak_ptr のオーナーベースのハッシュを提供する
(public メンバ関数) [編集]
weak_ptr のオーナーベースの等値比較を提供する
(public メンバ関数) [編集]

[編集] 非メンバ関数

std::swap アルゴリズムを特殊化する
(関数テンプレート) [編集]

[編集] ヘルパークラス

アトミック弱ポインタ
(クラステンプレート特殊化) [編集]

[編集] 推論ガイド (C++17以降)

[編集] 備考

std::shared_ptr と同様に、weak_ptr の典型的な実装は2つのポインタを格納します。

  • コントロールブロックへのポインタ。そして
  • それが構築された shared_ptr の格納されたポインタ。

エイリアスされた shared_ptr の場合でも、shared_ptrweak_ptr に変換し、その後元に戻すことが正しく機能するように、個別の格納されたポインタが必要です。weak_ptrshared_ptr にロックすることなく、weak_ptr 内の格納されたポインタにアクセスすることはできません。

機能テストマクロ 規格 機能
__cpp_lib_smart_ptr_owner_equality 202306L (C++26) 順序なし連想コンテナのキーとして std::weak_ptr の使用を有効にする

[編集]

lock がポインタの有効性を保証するためにどのように使用されるかを示します。

#include <iostream>
#include <memory>
 
std::weak_ptr<int> gw;
 
void observe()
{
    std::cout << "gw.use_count() == " << gw.use_count() << "; ";
    // we have to make a copy of shared pointer before usage:
    if (std::shared_ptr<int> spt = gw.lock())
        std::cout << "*spt == " << *spt << '\n';
    else
        std::cout << "gw is expired\n";
}
 
int main()
{
    {
        auto sp = std::make_shared<int>(42);
        gw = sp;
 
        observe();
    }
 
    observe();
}

出力

gw.use_count() == 1; *spt == 42
gw.use_count() == 0; gw is expired

[編集] 欠陥報告

以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。

DR 適用対象 公開された動作 正しい動作
LWG 3001 C++17 element_type が配列サポートのために更新されていなかった 更新済み

[編集] 関連項目

オブジェクトの所有権を唯一のものとするセマンティクスを持つスマートポインタ
(クラステンプレート) [編集]
オブジェクトの所有権を共有するセマンティクスを持つスマートポインタ
(クラステンプレート) [編集]
English 日本語 中文(简体) 中文(繁體)