std::weak_ptr<T>::lock
From cppreference.com
| std::shared_ptr<T> lock() const noexcept; |
(C++11以降) | |
管理されているオブジェクトの所有権を共有する新しいstd::shared_ptrを作成します。管理されているオブジェクトがない場合、すなわち*thisが空の場合、返されるshared_ptrも空になります。
実質的にはexpired() ? shared_ptr<T>() : shared_ptr<T>(*this)をアトミックに実行して返します。
目次 |
[編集] パラメータ
(なし)
[編集] 戻り値
std::weak_ptr::expiredがfalseを返す場合、所有するオブジェクトの所有権を共有するshared_ptr。そうでない場合は、型Tのデフォルト構築されたshared_ptrを返します。
[編集] 注記
この関数とstd::shared_ptrのコンストラクタは、std::weak_ptrが参照する管理オブジェクトの一時的な所有権を取得するために使用できます。違いは、std::shared_ptrのコンストラクタは、std::weak_ptr引数が空の場合に例外をスローするのに対し、std::weak_ptr<T>::lock()は空のstd::shared_ptr<T>を構築する点です。
[編集] 例
このコードを実行
#include <iostream> #include <memory> void observe(std::weak_ptr<int> weak) { if (auto p = weak.lock()) std::cout << "\tobserve() is able to lock weak_ptr<>, value=" << *p << '\n'; else std::cout << "\tobserve() is unable to lock weak_ptr<>\n"; } int main() { std::weak_ptr<int> weak; std::cout << "weak_ptr<> is not yet initialized\n"; observe(weak); { auto shared = std::make_shared<int>(42); weak = shared; std::cout << "weak_ptr<> is initialized with shared_ptr\n"; observe(weak); } std::cout << "shared_ptr<> has been destructed due to scope exit\n"; observe(weak); }
出力
weak_ptr<> is not yet initialized
observe() is unable to lock weak_ptr<>
weak_ptr<> is initialized with shared_ptr
observe() is able to lock weak_ptr<>, value=42
shared_ptr<> has been destructed due to scope exit
observe() is unable to lock weak_ptr<>[編集] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 2316 | C++11 | lock()はアトミックである必要はありませんでしたが、noexceptである必要があったため、矛盾が生じました。 | アトミックであることが指定されました。 |
[編集] 関連項目
| 参照されたオブジェクトが既に削除されたかどうかを確認する (public メンバ関数) |