2010-10-19 16 views
6

Beim Debuggen eines der Core-Dump des Programms stieß ich auf das Szenario, in dem sein polymorphes enthaltenes Objekt seinen VPTr verliert und ich sehe, dass es auf NULL zeigt.Warum verliert mein C++ - Objekt seinen VPTr

Was könnte das Szenario sein, wenn ein Objekt seinen VPTr verliert.

Vielen Dank im Voraus, Brijesh

+0

implementiert dieses Objekt mindestens eine 'virtuelle' Funktion? auch wenn dies nicht der Fall ist, besteht eine geringe Chance, dass der vptr "NULL" ist, da er (oft) zum Speichern der "typeinfo" verwendet wird. –

+0

Sind Sie sicher, dass der Speicher gereinigt wird? Möglicherweise liegt es an diesem Verhalten (http://www.artima.com/cppsource/nevercall.html), das Sie implementiert haben. – Keynslug

+0

Sie haben die gesamte Palette von _Undefined Behavior_ zur Auswahl - und das ist eine Menge. – sbi

Antwort

6
  1. Der Speicher trashed wurde, überschrieb das heißt etwas, um den Speicher.

  2. Sie haben es zerstört, indem Sie delete oder den Destruktor direkt aufgerufen haben. Dies führt normalerweise nicht dazu, dass das vptr NULL wird, sondern es wird nur auf die vtable der Basisklasse zeigen, aber das hängt von Ihrer Implementierung ab.

Höchstwahrscheinlich Fall 1. Wenn Sie einen Debugger haben, die Speicherhaltepunkte hat, und wenn Sie zuverlässig das Problem reproduzieren können, stellen Sie einen Speicher Stützpunkt auf der vptr und sehen, was es zu ändern.

5

Wahrscheinlich überschattete etwas das ganze Objekt. Etwas wie dieses:

memset(object, 0, sizeof(*object)); 

das ist in Ordnung, bis es auf ein Objekt mit vptr verwendet wird.

+0

Dieses Konstrukt sollte nicht für Klassen verwendet werden, die Nicht-POD-Daten enthalten, nicht nur für solche mit V-Tabellen. – CashCow

0

Es kann sein, dass Sie versuchen, die V-Tabelle während des Destruktors Ihres Objekts zu verwenden. Die V-Tabelle ist zu diesem Zeitpunkt nicht verfügbar.