2010-10-19 10 views
6

Durante il debug di uno dei core dump del programma mi sono imbattuto nello scenario in cui il suo oggetto contenuto che è polimorfo perde il suo VPTr e posso vederlo puntare a NULL.Perché il mio oggetto C++ perde il suo VPTr

Quale potrebbe essere lo scenario quando un oggetto perde il suo VPTr.

Grazie in anticipo, Brijesh

+0

questo oggetto implementa almeno una funzione 'virtuale'? anche se così non fosse, ci sono poche probabilità che il vptr sia 'NULL' così com'è (spesso) usato per memorizzare' typeinfo'. –

+0

Sei sicuro che la memoria sia stata pulita? Potrebbe essere dovuto a [questo comportamento] (http://www.artima.com/cppsource/nevercall.html) che hai implementato. – Keynslug

+0

Hai ottenuto l'intero intervallo di _Funzionamento indefinito_ da scegliere - e questo è molto. – sbi

risposta

6
  1. La memoria è stato cestinato, vale a dire qualcosa sovrascritto la memoria.

  2. L'hai distrutto chiamando delete o invocando direttamente il distruttore. Questo in genere non rende NULL il vptr, ma finirà per farlo puntare al vtable della classe base, ma questo dipende dalla tua implementazione.

Molto probabilmente, caso 1. Se si dispone di un debugger che ha punti di interruzione di memoria e se è possibile riprodurre il problema in modo affidabile, impostare un punto di interruzione di memoria sul vptr e vedere quello che sta modificandolo.

5

Probabilmente qualcosa ha sovrascritto l'intero oggetto. Qualcosa del genere:

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

che va bene finché non viene utilizzato su un oggetto con vptr.

+0

Questo costrutto non dovrebbe essere usato su qualsiasi classe che ha dati non POD, non solo quelli con tabelle v. – CashCow

0

È possibile che si stia tentando di utilizzare la v-table durante il distruttore dell'oggetto. La v-table non è disponibile in questo momento.