Was kann die Ursache VTable-Zeiger, 0xdddddddd in Win32-debug-build?

Ich bin debugging ein Mangel, und haben es eingeengt zu den vtable-Zeiger für ein Objekt 0xdddddddd. Diese Antwort zeigt an, dass die Win32 debug-builds wird in der Regel festgelegt, Toten Speicher, oder Speicher, die gelöscht wurde, um diesen besonderen Wert.

Beachten Sie, dass die Zeiger selbst sieht gültig, es ist nur die vtable-Zeiger, dass ist 0xdddddddd.

Hier ist ein code-snippet:

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     
}

Wenn ich Pause auf der Linie der Zugriffsverletzung und Uhr pMyObject kann ich sehen, dass pMyObject selbst hat eine gültige Adresse ( 0x08ede388 ), aber die __vfptr Mitglied ist ungültig (0xdddddddd).

Einige Hinweise:

  • Es ist ein single-threaded-Anwendung, so ist dies wahrscheinlich nicht eine race-condition oder mutex-Problem.
  • Dort nicht erscheinen zu sein irgendwelche offensichtlichen Probleme, wie löschen von dem Objekt, das sich weiter oben auf dem Aufruf-stack) vor dem Zugriff auf Sie.
  • Dieses Problem scheint nur reproduzierbar auf Windows 2008 server, aber nicht auf Windows 7.

Anregungen dazu, wie Sie Debuggen weiter?

  • Das sieht aus wie ein klassischer Fall von jemandem, löschen Sie das Objekt, nachdem Sie die Zeiger in die Liste ein. Sind Sie sicher, dass das nicht der Fall ist (es könnte gelöscht werden, eine andere Funktion, die nach dem Befüllen der Liste, so dass Sie einen Blick auf den call-stack kann nicht viel helfen). Die einfachste Sache zu versuchen ist, setzen Sie einen Haltepunkt in der Destruktor IMyObject und jemanden sehen, ist das löschen des Objekts.
Schreibe einen Kommentar