https://en.wikipedia.org/wiki/Magic_number_(programming)#Magic_debug_values
аживаю дефект и сузил его до указателя 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.Любые предложения о том, как отладить это дальше?