Spec-Zone.ru › C++

std::weak_ptr<T>::lock

std::shared_ptr<T> lock() const noexcept;
(с C++11)

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

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

Параметры

(нет)

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

A 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 Применимо к Поведение при публикации Правильное поведение
LWG 2316 C++11 lock() не требовалось быть атомарным, но требовалось быть noexcept, что приводило к противоречию указано, что атомарный

См. также

expired
проверяет, был ли ссылаемый объект уже удалён
(публичный член-функция)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/memory/weak_ptr/lock

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API