2016-02-24 3 views
0

В моем коде я использую общий указатель, используя функцию shared_from_this boost. Для того, чтобы держать его коротким, общий указатель разделяют на подобные линии, как показано ниже:Ссылки на указатели ссылок

class Q: public enable_shared_from_this<Q> 
{ 
public: 

    shared_ptr<Q> f() 
    { 
     return shared_from_this(); 
    } 
} 

int main() 
{ 
    shared_ptr<Q> p(new Q); 
    shared_ptr<Q> q = p->f(); 
    ..... 
    ..... 
} 

Когда я анализирую это в GDB:

(gdb) p *this 
$8 = { 
    .... 
    <boost::enable_shared_from_this<Q>> = { 
    weak_this_ = boost::weak_ptr<Q>(refs=0, weak=2) = { 
     px = (Q *) 0xa11f2000 
    } 
    } 
.... 
} 

Что такое значение «рефов» и слабых»ссылок здесь ? Действительно ли refs = 0 означает, что ссылки на объект отсутствуют?

Спасибо!

ответ

3

Контрольный блок для 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. Это может быть причиной аварии и приведет к тому, что вы наблюдаете.

+0

Я сомневаюсь, что программа остановилась в конструкторе класса Q, прежде чем конструировать указатель p –

+0

Это был всего лишь фрагмент кода, чтобы выделить, как используется shared_ptr. Итак, да, на самом деле в деле shared_ptr много чего происходит. – Maddy

+0

И вывод gdb был получен из анализа ядра, который был сгенерирован в объекте, который имеет тип shared_ptr, destructor. – Maddy

Смежные вопросы