2010-10-19 17 views
6

Al depurar uno de los volcados del núcleo del programa me encontré con el escenario donde su objeto contenido que es polimórfico pierde su VPTr y puedo ver que apunta a NULL.¿Por qué mi objeto C++ pierde su VPTr

Cuál podría ser el escenario cuando un objeto pierde su VPTr.

Gracias de antemano, Brijesh

+0

¿este objeto implementa al menos una función 'virtual'? incluso si no lo hace, hay pocas posibilidades de que vptr sea 'NULL' ya que (a menudo) se usa para almacenar' typeinfo'. –

+0

¿Estás seguro de que la memoria se está limpiando? Puede deberse a [este comportamiento] (http://www.artima.com/cppsource/nevercall.html) que ha implementado. – Keynslug

+0

Tienes toda la gama de _Comportamiento sin límites_ para elegir, y eso es mucho. – sbi

Respuesta

6
  1. La memoria ha sido colocado en la papelera, es decir, algo sobrescribieron la memoria.

  2. Lo destruyó llamando a delete o invocando el destructor directamente. Normalmente, esto no elimina NULL del vptr, sino que simplemente hace que apunte al vtable de la clase base, pero eso depende de su implementación.

Lo más probable es el caso 1. Si usted tiene un depurador que tiene puntos de interrupción de memoria y si se puede reproducir el problema de forma fiable, establece un punto de interrupción en la memoria VPTR y ver lo que está modificándolo.

5

Posible que algo sobrescriba el objeto completo. Algo como esto:

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

que está bien hasta que se utiliza en un objeto con vptr.

+0

Este constructo no debe usarse en ninguna clase que tenga datos que no sean POD, no solo aquellos con tablas v. – CashCow

0

Es posible que esté tratando de usar la tabla v durante el destructor de su objeto. La tabla v no está disponible en este momento.

Cuestiones relacionadas