std:: weak_ptr
|
ヘッダーで定義
<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にすることができます
。
目次 |
メンバー型
| メンバー型 | 定義 | ||||
element_type
|
|
メンバー関数
新しい
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) |
|
(C++26)
|
弱参照ポインタの所有者ベースの等値比較を提供する
(public member function) |
非メンバー関数
|
(C++11)
|
std::swap
アルゴリズムを特殊化
(関数テンプレート) |
ヘルパークラス
|
(C++20)
|
アトミック 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)
|
共有オブジェクト所有権セマンティクスを持つスマートポインタ
(クラステンプレート) |