Изменения счетчика ссылок C ++ при уничтожении объекта - PullRequest
1 голос
/ 06 февраля 2011

У меня есть частный счетчик ссылок внутри класса SharedObject. SharedObject является базовым классом для других классов, например Window. Окно является базовым классом редактора.

Когда счетчик ссылок достигает 0, из-за вызова SharedObject :: Release () SharedObject удаляет себя. Сначала мы перейдем к деструктору Editor, который показывает, что указатель this содержит m_refs == 0, но когда мы попадаем в деструктор Window, он внезапно становится равным 1, а когда мы достигаем деструктора SharedObject, он по-прежнему равен 1.

Я поставил точку останова на метод SharedObject :: IncRef (), и он никогда не вызывался, пока это происходило.

Что за?

Ответы [ 2 ]

2 голосов
/ 06 февраля 2011

Сборка с отключенной оптимизацией и установка точки останова памяти на вашем m_refs.

0 голосов
/ 06 февраля 2011

Похоже, у вас где-то есть утечка памяти, может быть, даже задолго до того, как произойдет это разрушение.Я использую Alleyoop, чтобы найти утечки.Может помочь, не помешает это убрать.

Используете ли вы несколько потоков?Возможно, это связано с тем, что какой-то необработанный указатель где-то захватывается другим потоком во время уничтожения.

В дополнение к этому я рекомендую использовать boost :: intrusive_ptr - очень удобный шаблон для обработки адресов и выпусков в общих объектах, который помогаетследуя за этим, но это, вероятно, не решит вашу проблему, если у вас нет реального беспорядка в вашем коде;)

...