2010-10-19 2 views
6

Во время отладки одного из дампов программы я наткнулся на сценарий, где его содержащий объект, который является полиморфным, теряет свой VPTr, и я вижу его указание на NULL.Почему мой объект C++ теряет свой VPTr

Какой может быть сценарий, когда объект теряет свой VPTr.

Спасибо заранее, Brijesh

+0

Этот объект реализует хотя бы одну функцию 'virtual'? даже если это не так, мало шансов, что vptr будет 'NULL', поскольку он (часто) используется для хранения' typeinfo'. –

+0

Вы уверены, что память очищается? Возможно, это связано с [этим поведением] (http://www.artima.com/cppsource/nevercall.html), который вы внедрили. – Keynslug

+0

У вас есть весь диапазон _Undefined Behavior_, чтобы выбрать - и это много. – sbi

ответ

6
  1. Память была громил, то есть что-то затирает память.

  2. Вы уничтожили его, вызвав удаление или вызвав деструктор напрямую. Как правило, это не NULL из vptr, он просто закончит тем, что он укажет на таблицу vtable базового класса, но это зависит от вашей реализации.

Скорее всего, дело 1. Если у вас есть отладчик, который имеет точки останова памяти, и если вы можете воспроизвести проблему надежно установить точку останова памяти на vptr и посмотреть, что это изменение.

5

Вероятно, что-то переписало весь объект. Что-то вроде этого:

memset(object, 0, sizeof(*object)); 

, который отлично до тех пор, пока он не будет использован на объекте с vptr.

+0

Эта конструкция не должна использоваться ни в одном классе, который имеет не-POD-данные, а не только с v-таблицами. – CashCow

0

Возможно, вы пытаетесь использовать v-таблицу во время деструктора объекта. В настоящее время v-таблица недоступна.