Namespaces
Variants

std::weak_ptr<T>:: lock

From cppreference.net
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
std:: shared_ptr < T > lock ( ) const noexcept ;
(начиная с C++11)

Создает новый std::shared_ptr , который разделяет владение управляемым объектом. Если управляемый объект отсутствует, т.е. * this является пустым, то возвращаемый shared_ptr также будет пустым.

Эффективно возвращает expired ( ) ? shared_ptr < T > ( ) : shared_ptr < T > ( * this ) , выполняя операцию атомарно.

Содержание

Возвращаемое значение

shared_ptr , который разделяет владение управляемым объектом, если std::weak_ptr::expired возвращает false . В противном случае возвращает сконструированный по умолчанию shared_ptr типа T .

Примечания

Как эта функция, так и конструктор 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 Applied to Behavior as published Correct behavior
LWG 2316 C++11 lock() не требовался быть атомарным, но требовался быть noexcept, что приводило к противоречию указано быть атомарным

Смотрите также

проверяет, был ли уже удалён ссылаемый объект
(public member function)