# std::weak_ptr<T>::lock

< cpp‎ | memory‎ | weak ptr

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 observe = weak.lock()) {
            std::cout << "\tobserve() able to lock weak_ptr<>, value=" << *observe << "\n";
        } else {
            std::cout << "\tobserve() unable to lock weak_ptr<>\n";
        }
    }

    int main()
    {
        std::weak_ptr<int> weak;
        std::cout << "weak_ptr<> not yet initialized\n";
        observe(weak);

        {
            auto shared = std::make_shared<int>(42);
            weak = shared;
            std::cout << "weak_ptr<> initialized with shared_ptr.\n";
            observe(weak);
        }

        std::cout << "shared_ptr<> has been destructed due to scope exit.\n";
        observe(weak);
    }

输出：

    weak_ptr<> not yet initialized
            observe() unable to lock weak_ptr<>
    weak_ptr<> initialized with shared_ptr.
            observe() able to lock weak_ptr<>, value=42
    shared_ptr<> has been destructed due to scope exit.
            observe() unable to lock weak_ptr<>

### 缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

DR | 应用于 | 出版时的行为 | 正确行为
--- | --- | --- | ---
LWG 2316 | C++11 | 不要求 lock() 是原子的，但要求为 noexcept ，这导致矛盾 | 指定为原子的

### 参阅

expired | 检查被引用的对象是否已删除 (公开成员函数)