Я отлаживаю дефект и сузил его до указателя vtable для объекта, являющегося 0xdddddddd
. Этот ответ указывает, что в отладочных сборках Win32 это специальное значение обычно устанавливается для мертвой памяти или памяти, которая была удалена.
Обратите внимание, что указатель сам по себе выглядит допустимым, это просто указатель vtable , то есть 0xdddddddd
.
Вот фрагмент кода:
std::list<IMyObject*>::const_iterator it;
for (it = myObjects.begin(); it != myObjects.end(); ++it)
{
IMyObject* pMyObject = *it;
if (pMyObject == 0)
continue;
pMyObject->someMethod(); // Access violation
}
Если я нарушу строку нарушения доступа исмотрите pMyObject
, я вижу, что сам pMyObject
имеет действительный адрес (0x08ede388
), но член __vfptr
недействителен (0xdddddddd
).
Некоторые примечания:
- Это однопоточное приложение, так что это, скорее всего, не проблема гонки или мьютекса.
- Кажется, что нет никаких очевидных проблем, таких как удаление объекта дальше вверх по стеку вызовов додоступ к нему.
- Эта проблема, по-видимому, воспроизводима только на сервере Windows 2008, но не на Windows 7.
Любые предложения о том, как отладить это дальше?