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 のもう1つの用途は、std::shared_ptr によって管理されるオブジェクトによって形成される参照サイクルを解除することです。そのようなサイクルが孤立している場合(つまり、サイクル内に外部の共有ポインタがない場合)、shared_ptr の参照カウントはゼロにならず、メモリリークが発生します。これを防ぐために、サイクルのいずれかのポインタを弱くすることができます。
目次 |
[編集] メンバ型
| メンバ型 | 定義 | ||||
element_type
|
|
[編集] メンバ関数
新しい weak_ptr を作成する(public メンバ関数) | |
weak_ptr を破棄する(public メンバ関数) | |
weak_ptr を代入する(public メンバ関数) | |
変更 | |
| 管理対象オブジェクトの所有権を解放する (public メンバ関数) | |
| 管理対象オブジェクトを交換する (public メンバ関数) | |
監視 | |
オブジェクトを管理する shared_ptr オブジェクトの数を返す(public メンバ関数) | |
| 参照されたオブジェクトが既に削除されたかどうかを確認する (public メンバ関数) | |
参照されたオブジェクトを管理する shared_ptr を作成する(public メンバ関数) | |
| weak pointer の所有者ベースの順序付けを提供します (public メンバ関数) | |
| (C++26) |
weak_ptr のオーナーベースのハッシュを提供する (public メンバ関数) |
| (C++26) |
weak_ptr のオーナーベースの等値比較を提供する (public メンバ関数) |
[編集] 非メンバ関数
| (C++11) |
std::swap アルゴリズムを特殊化する (関数テンプレート) |
[編集] ヘルパークラス
| (C++20) |
アトミック弱ポインタ (クラステンプレート特殊化) |
[編集] 推論ガイド (C++17以降)
[編集] 備考
std::shared_ptr と同様に、weak_ptr の典型的な実装は2つのポインタを格納します。
- コントロールブロックへのポインタ。そして
- それが構築された
shared_ptrの格納されたポインタ。
エイリアスされた shared_ptr の場合でも、shared_ptr を weak_ptr に変換し、その後元に戻すことが正しく機能するように、個別の格納されたポインタが必要です。weak_ptr を shared_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 が配列サポートのために更新されていなかった |
更新済み |
[編集] 関連項目
| (C++11) |
オブジェクトの所有権を唯一のものとするセマンティクスを持つスマートポインタ (クラステンプレート) |
| (C++11) |
オブジェクトの所有権を共有するセマンティクスを持つスマートポインタ (クラステンプレート) |