__vftptr равен NULL - PullRequest
       5

__vftptr равен NULL

3 голосов
/ 14 июня 2009

Мы получили аварийный дамп с сайта клиента. Я вижу, что в одной из структур __vfptr - NUL.

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

Ответы [ 5 ]

14 голосов
/ 14 июня 2009

Используете ли вы где-нибудь memset () в экземплярах ваших классов?

Я видел эту проблему раньше, и причиной был код типа

class C : SomeClassWithVirtualFunctions
{
public:
  C()
  {
    <b>memset( this, 0, sizeof ( C ) ) ;</b> // BAD!! sets _vfptr to 0 too
  }
}

cppcheck аккуратно

6 голосов
/ 14 июня 2009

Возможно, вы видите частично разрушенный объект в стеке. Компилятор может пометить часть объекта как уничтоженную путем очистки указателя таблицы виртуальных функций, чтобы он мог правильно реализовывать деструкторы классов с наследованием «алмаз» (множественное наследование классов, имеющих общий виртуальный базовый класс). во время уничтожения объекта вы увидите частично разрушенный объект на свалке.

Старые компиляторы MSVC неправильно реализовали деструкторы для классов с наследованием алмазов. Всякий раз, когда вы пытались уничтожить один, программа зависала. Я не уверен, что это все еще так.

1 голос
/ 14 июня 2009

Это может произойти, если вы попытаетесь получить информацию о типе во время выполнения (т. Е. Использовать функцию typeid) для объекта класса, который не имеет виртуальных функций.

1 голос
/ 14 июня 2009

Хотя в целом ответ «да», я думаю, вы должны учитывать, что это может быть и сбой отладчика.

0 голосов
/ 14 июня 2009

Обычно я получаю повреждение vptr, когда объект был удален дважды (и да, это всегда ошибка). В большинстве случаев для меня vptr просто указывает на какой-то случайный блок памяти, но звучит так, будто ваш перезаписывается NULL, что может быть из-за того, что ОС отбрасывает освобожденную память, или может указывать на то, что делает перезапись.

Попробуйте использовать boost :: shared_ptr , чтобы сохранить срок службы с правами собственности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...