2010-10-19 7 views
6

Lors du débogage de l'un des vidage de mémoire du programme, je suis tombé sur le scénario où son objet contenu qui est polymorphe perd son VPTr et je peux voir son pointage vers NULL.Pourquoi mon objet C++ perd-il VPTr

Quel pourrait être le scénario lorsqu'un objet perd son VPTr.

Merci à l'avance, Brijesh

+0

cet objet met-il en œuvre au moins une fonction 'virtual'? même si ce n'est pas le cas, il y a peu de chance que le vptr soit 'NULL' car il est (souvent) utilisé pour stocker le' typeinfo'. –

+0

Êtes-vous sûr que la mémoire est nettoyée? Cela peut être dû à [ce comportement] (http://www.artima.com/cppsource/nevercall.html) que vous avez implémenté. – Keynslug

+0

Vous avez toute la gamme de Comportement indéfini à choisir - et c'est beaucoup. – sbi

Répondre

6
  1. La mémoire a été saccagé, à savoir quelque chose réenregistrés la mémoire.

  2. Vous l'avez détruit en appelant delete ou en appelant le destructeur directement. Cela ne fait généralement pas de NULL sur le vptr, il va juste finir par l'avoir pointé vers le vtable de la classe de base, mais cela dépend de votre implémentation.

, cas 1. Très probablement Si vous avez un débogueur qui a des points d'arrêt de mémoire et si vous pouvez reproduire le problème de manière fiable, définissez un point d'arrêt de la mémoire sur le VPTR et voir ce qui se modifier.

5

Il est probable que quelque chose a écrasé l'objet entier. Quelque chose comme ceci:

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

ce qui est bien jusqu'à ce qu'il soit utilisé sur un objet avec vptr.

+0

Cette construction ne doit pas être utilisée sur une classe qui a des données non-POD, pas seulement celles avec des tables-v. – CashCow

0

Il se peut que vous essayiez d'utiliser la table v pendant le destructeur de votre objet. La table v n'est pas disponible pour le moment.

Questions connexes