Метод lock
Метод lock класса weak_ptr пытается получить
временный shared_ptr на объект, за которым наблюдает
weak_ptr. Если объект еще жив (то есть на него
ссылается хотя бы один shared_ptr), метод возвращает
shared_ptr, владеющий этим объектом, и счетчик
ссылок увеличивается на 1. Если же объект уже был
удален, метод возвращает пустой shared_ptr, который
при приведении к bool дает false. Метод не
принимает параметров и является потокобезопасным.
Синтаксис
weak_ptr<T>::lock()
Пример
Давайте создадим shared_ptr, затем weak_ptr
из него и попробуем получить владеющий указатель через
lock, пока объект еще существует:
#include <iostream>
#include <memory>
using namespace std;
int main()
{
shared_ptr<int> sp = make_shared<int>(42);
weak_ptr<int> wp = sp;
shared_ptr<int> res = wp.lock();
if (res) {
cout << *res << endl;
} else {
cout << "object is gone" << endl;
}
return 0;
}
Результат выполнения кода:
42
Пример
Теперь давайте сбросим все владеющие указатели и посмотрим,
что вернет lock после уничтожения объекта:
#include <iostream>
#include <memory>
using namespace std;
int main()
{
shared_ptr<int> sp = make_shared<int>(42);
weak_ptr<int> wp = sp;
sp.reset();
shared_ptr<int> res = wp.lock();
if (res) {
cout << *res << endl;
} else {
cout << "object is gone" << endl;
}
return 0;
}
Результат выполнения кода:
"object is gone"
Смотрите также
-
класс
weak_ptr,
который хранит слабую ссылку на объект -
метод
expired,
который проверяет, был ли объект уже удален -
класс
shared_ptr,
который управляет временем жизни объекта -
метод
lock,
который безопасно получает доступ к объекту