Контрольный блок для shared_ptr
содержит два контрольных количества. Один из них - это сильный счетчик ссылок, который увеличивается один раз для каждого объекта shared_ptr
. Когда он обращается в ноль, объект уничтожается (и освобождается, если только он не был выделен make_shared
).
Другое - это слабый счетчик ссылок, увеличиваемый один раз до тех пор, пока существуют сильные ссылки, и снова для каждого weak_ptr
. Когда он достигает нуля, блок управления уничтожается и освобождается.
Так что да, теоретически дисплей отладки refs=0
означает, что ссылки на объект отсутствуют. Однако в зависимости от того, где остановлена ваша программа, это звучит маловероятно, в программе, которую вы нам показываете, p
живет до конца main
и не должен отказываться от своей справки. Возможно, отображение отладчика неверно, особенно если вы скомпилированы с оптимизацией.
Редактировать:
Слабый кол-2, тогда как рефов равно 0 означает, что все сильные ссылки исчезли (все shared_ptr
экземпляров, относящихся к объекту, были уничтожены), но есть 2 weak_ptr
с остальным; если только моментальный снимок, который вы просматриваете, определенно находится в деструкторе последнего shared_ptr
, после уменьшения сильного счета, но до уменьшения слабого счета, и в этом случае это означает, что осталось только один слабый_ptr (который может быть тем, который хранится в enable_shared_from_this
, если моментальный снимок во время деструктора объекта).
Вы вызываете shared_from_this
в деструктор Q
и используете результат без проверки на нуль? shared_from_this
не работает в конструкторах и деструкторах и всегда возвращает null. Это может быть причиной аварии и приведет к тому, что вы наблюдаете.
Я сомневаюсь, что программа остановилась в конструкторе класса Q, прежде чем конструировать указатель p –
Это был всего лишь фрагмент кода, чтобы выделить, как используется shared_ptr. Итак, да, на самом деле в деле shared_ptr много чего происходит. – Maddy
И вывод gdb был получен из анализа ядра, который был сгенерирован в объекте, который имеет тип shared_ptr, destructor. – Maddy