#c #smart-pointers #weak-ptr
Вопрос:
Я полный новичок в интеллектуальных указателях, и я никогда не имел дела с weak_ptr
C .
У меня есть функция в классе Y
, которая принимает в качестве параметра a weak_ptr
класса X
.
Внутри функции в классе Y
мне нужно получить доступ к функциям-членам класса X
через weak_ptr
.
Для справки, вот примерное определение класса:
Y.cpp
class Y {
public : Y();
~Y();
int foo(std::weak_ptr<X> x);
};
X.cpp
class X {
public : std::string func1();
int func2();
};
Внутри foo()
функции в классе Y
мне нужно иметь доступ к функциям func1
и func2
использовать weak_ptr x
.
Я не знаю , зачем мне это нужно weak_ptr
, но это то, что я должен реализовать.
Я не могу найти ни одного удобного для начинающих примера кода с использованием weak_ptr
.
Комментарии:
1.en.cppreference.com/w/cpp/memory/weak_ptr/lock ?
2. Совет: Я почти никогда не нуждался в
shared_ptr
. Ты, наверное, тоже не знаешь.3. Я не уверен, почему, но меня попросили специально использовать weak_ptr в моем случае. Хотелось бы знать, в каких сценариях используется weak_ptr и когда они полезны
Ответ №1:
Вам нужно преобразовать его в shared_ptr
первый, используя .lock()
:
int foo(std::weak_ptr<X> x)
{
std::shared_ptr<X> y = x.lock(); // Or `auto y = x.lock();`.
y->do_stuff();
}
Обоснование заключается в том, что a weak_ptr
не является владельцем (в отличие shared_ptr
от), поэтому, если бы вы могли разыменовать его напрямую, был бы риск того, что целевой объект будет уничтожен из другого потока, пока вы это делаете.
Возможно, было бы неплохо проверить, не является ли результирующий указатель ( y
) нулевым, прежде чем использовать его, если только сбой, если он равен нулю, не является приемлемым способом обработки ошибки в вашем случае.
Это плохая идея-звонить .lock()
каждый раз (вместо одного раза и сохранять результат в переменной), так как цель может быть уничтожена между вызовами (и это было бы дороже).