Namespaces
Variants

std:: weak_ptr

From 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)
ヘッダーで定義 <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 のもう一つの用途は、 std::shared_ptr によって管理されるオブジェクト間で形成される参照循環を断ち切ることです。このような循環が孤立した場合(つまり、循環外部からのshared_ptrが存在しない場合)、 shared_ptr の参照カウントがゼロに達することができず、メモリリークが発生します。これを防ぐために、循環内のポインタの一つを weakにすることができます

目次

翻訳の注意点: - 「Contents」を「目次」に翻訳 - C++専門用語(Member types, Member functions, Modifiers, Observers, Non-member functions, Helper classes, Deduction guides, Notes, Example, Defect reports, See also)は原文のまま保持 - HTMLタグ、属性、数値、C++17表記は一切変更せず - フォーマットと構造を完全に維持

メンバー型

メンバー型 定義
element_type

T

(C++17まで)

std:: remove_extent_t < T >

(C++17以降)

メンバー関数

新しい weak_ptr を作成する
(public member function)
weak_ptr を破棄する
(public member function)
weak_ptr を代入する
(public member function)
修飾子
管理対象オブジェクトの所有権を解放する
(public member function)
管理対象オブジェクトを交換する
(public member function)
オブザーバー
オブジェクトを管理する shared_ptr オブジェクトの数を返す
(public member function)
参照先オブジェクトが既に削除されているかどうかをチェックする
(public member function)
参照先オブジェクトを管理する shared_ptr を作成する
(public member function)
弱参照ポインタの所有者ベースの順序付けを提供する
(public member function)
(C++26)
弱参照ポインタの所有者ベースのハッシュを提供する
(public member function)
弱参照ポインタの所有者ベースの等値比較を提供する
(public member function)

非メンバー関数

std::swap アルゴリズムを特殊化
(関数テンプレート)

ヘルパークラス

アトミック weak ポインタ
(クラステンプレートの特殊化)

推論ガイド (C++17以降)

注記

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

  • 制御ブロックへのポインタ;および
  • 構築元の shared_ptr が保持していた格納ポインタ。

別個に格納されたポインタは、 shared_ptr weak_ptr に変換し、その後元に戻す操作が、エイリアス化された shared_ptr に対しても正しく機能することを保証するために必要です。 weak_ptr 内の格納されたポインタにアクセスするには、それを shared_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 was not updated for array support 更新済み

関連項目

(C++11)
ユニークなオブジェクト所有権セマンティクスを持つスマートポインタ
(クラステンプレート)
(C++11)
共有オブジェクト所有権セマンティクスを持つスマートポインタ
(クラステンプレート)