почему weak_ptr может повредить циклическую ссылку?

Я узнал много о weak_ptr, работающем с share_ptr для повреждения циклической ссылки.Как это работает? Как использовать это? Какое-либо тело может дать мне пример? Я полностью потерян здесь.

Еще один вопрос, что такое сильный указатель?

10
задан skydoor 3 March 2010 в 20:33
поделиться

2 ответа

Оно не включается в счетчик ссылок, поэтому ресурс может быть освобожден даже при наличии слабых указателей. При использовании weak_ptr вы получаете от него shared_ptr, временно увеличивая счетчик ссылок. Если ресурс уже освобожден, получение shared_ptr не удастся.

Q2: shared_ptr - сильный указатель. Пока существует какой-либо из них, ресурс не может быть освобожден.

6
ответ дан 3 December 2019 в 22:36
поделиться

Сильный указатель содержит сильную ссылку на объект - это означает: пока существует указатель, объект не уничтожается.

Объект не «знает» каждый указатель по отдельности, а только их количество - это сильный счетчик ссылок.

Тип weak_ptr «запоминает» объект, но не предотвращает его уничтожение. Вы не можете получить доступ к объекту напрямую через слабый указатель, но вы можете попытаться создать сильный указатель из слабого указателя. Если объект больше не существует, результирующий строгий указатель будет нулевым:

shared_ptr<int> sp(new int);
weak_ptr<int> wp(sp);

shared_ptr<int> stillThere(wp);
assert(stillThere);  // yes, the original object still exists, we can now use it
stillThere.reset();  // releasing the strong reference

sp.reset();          // here, the object gets destroyed, 
                     // because there's only one weak_ptr left

shared_ptr<int> notReally(wp);
assert(!notReally);  // the object is destroyed, 
                     // you can't get a strong pointer to it anymore
9
ответ дан 3 December 2019 в 22:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: