std::weak_ptr<T>:: lock
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Member functions | ||||
| Modifiers | ||||
| Observers | ||||
|
weak_ptr::lock
|
||||
|
(C++26)
|
||||
|
(C++26)
|
||||
| Non-member functions | ||||
| Helper classes | ||||
|
(C++20)
|
||||
| Deduction guides (C++17) |
|
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) |