std::weak_ptr<T>::lock
来自cppreference.com
<tbody>
</tbody>
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() 可以锁定 weak_ptr<>, value=" << *p << '\n';
else
std::cout << "\tobserve() 无法锁定 weak_ptr<>\n";
}
int main()
{
std::weak_ptr<int> weak;
std::cout << "weak_ptr<> 尚未初始化\n";
observe(weak);
{
auto shared = std::make_shared<int>(42);
weak = shared;
std::cout << "weak_ptr<> 以 shared_ptr 初始化\n";
observe(weak);
}
std::cout << "shared_ptr<> 已因退出作用域而析构\n";
observe(weak);
}
输出:
weak_ptr<> 尚未初始化
observe() 无法锁定 weak_ptr<>
weak_ptr<> 以 shared_ptr 初始化
observe() 可以锁定 weak_ptr<>, value=42
shared_ptr<> 已因退出作用域而析构
observe() 无法锁定 weak_ptr<>
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
| 缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
|---|---|---|---|
| LWG 2316 | C++11 | 不要求 lock() 是原子的,但要求为 noexcept,这导致矛盾 | 指定为原子的 |
参阅
| 检查被引用的对象是否已删除 (公开成员函数) |