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), выполнясь атомарно.
Параметры
(нет)
Возвращаемое значение
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() может заблокировать weak_ptr<>, значение=" << *p << '\n';
else
std::cout << "\tobserve() не может заблокировать lock 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, что приводило к противоречию |
указан как атомарный |
Смотрите также
| проверяет, был ли удалён объект, на который ссылается weak_ptr (public функция-элемент) |