¿Qué puede hacer que el puntero de VTable sea 0xdddddddd en la compilación de depuración de Win32?
stoy depurando un defecto y lo he reducido al puntero vtable para que un objeto sea0xdddddddd
. Esta respuesta indica que las compilaciones de depuración de Win32 generalmente establecerán la memoria muerta, o la memoria que se ha eliminado, en este valor especial.
Nota que elpunter en sí parece válido, es solo elvtable puntero es decir0xdddddddd
.
Aquí hay un fragmento de código:
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
}
Si rompo la línea de la infracción de acceso y veopMyObject
, Puedo ver esopMyObject
tiene una dirección válida 0x08ede388
) pero el__vfptr
miembro no es válido 0xdddddddd
).
Algunas notas
Es una aplicación de un solo subproceso, por lo que probablemente no sea una condición de carrera o un problema de mutex. No parece haber ningún problema obvio, como eliminar el objeto más arriba en la pila de llamadas antes de acceder a él.ste problema parece ser solo reproducible en el servidor de Windows 2008, pero no en Windows 7.¿Alguna sugerencia sobre cómo depurar esto más?