Насколько я понимаю, слабый указатель используется для циклической зависимости, возникает проблема, если мы используем все объекты shared_ptr и если есть циклическая зависимость. Слабые указатели используются для разрыва циклов. слабые указатели достигают этого с помощью блокировки(), которая создает общий указатель.
class A { shared_ptr<B> b; ... };
class B { weak_ptr<A> a; ... };
shared_ptr<A> x(new A); // +1
x->b = new B; // +1
x->b->a = x; // No +1 here
Но теперь предположим, что я создал блокировку, вызвав x->b->a.lock(), поэтому счетчик ссылок x станет равным 2. и если x покинет область видимости, все равно будет утечка памяти, верно? Поскольку я создал общий указатель, используя lock(), и количество ссылок стало равным 2. Пожалуйста, дайте мне знать, верно ли мое понимание или нет.
lock()
, уничтожается его деструктором, он снова уменьшает счетчик. - person Richard J. Ross III   schedule 06.03.2014lock()
? Если вы проигнорируете его, блокировка немедленно снова будет снята. - person aschepler   schedule 06.03.2014lock()
, немедленно освобождается, и поэтому счетчик ссылок возвращается к исходному. Если вы хотите расширить код, представленный на альтернативный вопрос, вам придется сделать это в самом вопросе. Что касается кода как написано, я не уверен, что понимаю ваш вопрос на данный момент. (для меня это будет не в первый раз). - person WhozCraig   schedule 06.03.2014