std::weak_ptr<T>::lock
std::shared_ptr<T> lock() const noexcept; |
(с C++11) (constexpr с C++26) |
Создаёт новый std::shared_ptr, совместно владеющий управляемым объектом. Если управляемого объекта нет, то есть *this пуст, возвращённый shared_ptr также будет пустым.
Возвращаемое значение
expired() ? shared_ptr<T>() : shared_ptr<T>(*this) (выполняется атомарно)
Примечания
Эту функцию и конструктор 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, что приводило к противоречию | уточнено, что операция должна быть атомарной |
См. также
| проверяет, был ли указанный объект уже удалён (открытая функция-член) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/memory/weak_ptr/lock