Я отлаживаю дефект и сузил его до указателя 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.
Любые предложения о том, как отлаживать это дальше?
IMyObject
и увидеть, что кто-то удаляет объект. - person Naveen   schedule 19.04.2011