Estoy depurando un defecto y lo he reducido al puntero vtable para un objeto que es 0xdddddddd
. This answer indica que las versiones de depuración de Win32 generalmente establecerán la memoria inactiva, o la memoria que se ha eliminado, a este valor especial.¿Qué puede hacer que el puntero de VTable sea 0xdddddddd en la compilación de depuración de Win32?
Tenga en cuenta que el puntero sí parece válida, es sólo la puntero vtable que es 0xdddddddd
.
He aquí 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 en la línea de la violación de acceso y ver pMyObject
, puedo ver que pMyObject
en sí tiene una dirección válida (0x08ede388
), pero el miembro __vfptr
no es válido (0xdddddddd
).
Algunas notas:
- Es una aplicación de un solo subproceso, así que esto es muy probable que no una condición de carrera o un problema de exclusión mutua.
- No parece haber ningún problema obvio como eliminar el objeto más arriba en la pila de llamadas antes de acceder a él.
- Este problema sólo parece ser reproducibles en el servidor Windows 2008, pero no en Windows 7.
Cualquier sugerencia sobre cómo depurar esta otra?
Esto parece un caso clásico de alguien que elimina el objeto después de colocar el puntero en la lista. ¿Está seguro de que ese no es el caso (podría eliminarse de alguna otra función después de completar la lista, por lo que echar un vistazo a la pila de llamadas puede no ser de mucha ayuda). Lo más simple es intentar poner un punto de interrupción en el destructor de 'IMyObject' y ver que alguien está eliminando el objeto. – Naveen