Я много узнал о том, что weak_ptr работает с share_ptr, чтобы разбить циклическую ссылку. Как это работает? Как это использовать? Может ли какой-нибудь орган дать мне пример? Я полностью потерян здесь.
Еще один вопрос, какой сильный указатель?
Я много узнал о том, что weak_ptr работает с share_ptr, чтобы разбить циклическую ссылку. Как это работает? Как это использовать? Может ли какой-нибудь орган дать мне пример? Я полностью потерян здесь.
Еще один вопрос, какой сильный указатель?
Он не включен в число ссылок, поэтому ресурс может быть освобожден, даже если существуют слабые указатели. При использовании weak_ptr вы приобретаете у него shared_ptr, временно увеличивая счетчик ссылок. Если ресурс уже освобожден, получение shared_ptr завершится с ошибкой.
Q2: shared_ptr - сильный указатель. Пока любой из них существует, ресурс не может быть освобожден.
Сильный указатель содержит сильную ссылку на объект - это означает: до тех пор, пока указатель существует, объект не уничтожается.
Объект не "знает" каждого указателя индивидуально, а просто их число - то, что сильная ссылка подсчитывается.
Функция 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