Почему weak_ptr может разорвать циклическую ссылку?

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

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

Ответ 1

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

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

Ответ 2

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

Объект не "знает" каждого указателя индивидуально, а просто их число - то, что сильная ссылка подсчитывается.

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

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 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