Tengo un puntero a una clase determinada. Digamos, por ejemplo, el puntero es:¿Qué determina qué se escribe en un puntero de C++ cuando se llama a delete?
0x24083094
que los puntos de puntero a:
0x03ac9184
que es la tabla de función virtual de mi clase. Eso tiene sentido para mí. En windbg, todo parece correcto.
Elimino dicho puntero. Ahora bien, en 0x24083094
es:
0x604751f8
Pero no es un poco de basura al azar, esa dirección se pone en allí cada vez, es consistentemente 0x604751f8
! Tanto que realmente puedo usar esa dirección para determinar si ese puntero fue eliminado, ¡entre las ejecuciones de mi aplicación!
¿Pero por qué? ¿Cómo se determina que 0x604751f8
se debe escribir allí?
Para que conste, estoy usando ventanas, edificio en Visual Studio 2003.
Sé que no puedo confiar en que se establece que el valor, incluso si parece ser consistente, pero puedo confiar en siendo diferente? Es decir, 0x03ac9184
no estará en 0x24083094
si se borra el puntero, ¿verdad? ¿Qué se pone ahí? Puede ser cualquier cosa, pero 0x03ac9184
definitivamente no estará allí (o aún podría llamar a métodos, ya que esa es la tabla de funciones virtuales). ¿Estoy en lo cierto?
Siento que tengo una respuesta. no puede confiar en nada después de que se elimine. Tal vez algunos antecedentes ayudarán a las personas a ver de dónde vengo. Esencialmente, estoy tratando de arreglar un error donde un puntero se elimina de debajo de mí. Es una larga historia, no entraré en detalles.
Básicamente, estoy tratando de detectar que estoy en esta situación, así que puedo salir de mi función. Supongo que la forma más fácil y mejor es averiguar quién posee este puntero, y preguntarle si algo ha cambiado. Así que voy a implementar una solución como esa. Evita todo este hacker de eliminación de C++ que estuve discutiendo.
Sin embargo,, lo interesante es que en nuestro código tenemos una clase llamada 'BogusObject' que esencialmente actúa como una bandeja que captura personas que accidentalmente desreferencian los objetos liberados. Básicamente, enganchamos nuestras propias funciones de eliminación y bash la clase BogusObject en el vtable de cualquier clase liberada.
Luego, si alguien llama a algo, recibe un bonito mensaje diciendo algo en el sentido de "hey, algo está mal amigo". Esto está sucediendo en mi caso. Es decir, 0x604751f8+(someoffset)
está dentro de la clase BogusObject. ¡Pero ya no usamos BogusObject! Literalmente no está configurado en ningún lado (incluso enlaces correctamente si elimino completamente la clase BogusObject), y aún así recibo el bonito mensaje de que algo está mal. Pero ahora soy de la opinión de que es una coincidencia.
Por alguna razón, el tiempo de ejecución está poniendo ese valor 0x604751f8
en este puntero cuando se elimina, y eso simplemente corresponde a la clase que tiene el propósito de detectar situaciones como esta.
¿Por qué no establece un punto de interrupción de datos en su puntero (0x24083094) y ve cuando se escribe 0x604751f8 en él? Cuando el depurador se rompe, rastrea la pila para ver quién te llamó y de dónde vino el valor. –
Sí, lo hice. Se cambia después de regresar de myModule! MyClass :: 'vector deleting destructor '. He entrado en cada línea entre cuando se llama a eliminar y cuando cambia. De hecho, tengo un registro de Windbg que muestra esto, con algunos dt's cambiando. Sin embargo, tiene muchas cosas de la compañía, así que tendré que restregarme antes de compartir. – pj4533