Ho un puntatore a una determinata classe. Diciamo, per esempio, il puntatore è:Cosa determina cosa viene scritto in un puntatore C++ quando viene chiamato delete?
0x24083094
che punta puntatore a:
0x03ac9184
che è la tabella di funzione virtuale della mia classe. Questo ha senso per me. In windbg, tutto sembra corretto.
Cancellare detto puntatore. Ora a 0x24083094
è:
0x604751f8
Ma non è un po 'di spazzatura a caso, tale indirizzo è messo lì ogni volta, è costantemente 0x604751f8
! Tanto che posso effettivamente usare quell'indirizzo per determinare se quel puntatore è stato cancellato, tra le esecuzioni della mia applicazione!
Ma perché? Come si determina che 0x604751f8
debba essere scritto lì?
Per la cronaca, io sto usando le finestre, edificio in Visual Studio 2003.
so che non posso contare su tale valore viene impostato, anche se non sembra essere coerente, ma posso contare su è diverso? Ad esempio, 0x03ac9184
non sarà a 0x24083094
se il puntatore viene eliminato, giusto? Cosa viene messo lì? Potrebbe essere qualsiasi cosa, ma 0x03ac9184
non ci sarà sicuramente (altrimenti potrei ancora chiamare metodi, dato che è la tabella delle funzioni virtuali). Ho ragione?
Mi sento come se avessi una risposta. non posso fare affidamento su nulla dopo che è stato cancellato. Forse un po 'di background aiuterà le persone a vedere da dove vengo. In sostanza, sto cercando di correggere un bug in cui un puntatore viene eliminato da sotto di me. È una lunga storia, non entrerò nei dettagli.
Fondamentalmente, sto cercando di rilevare che sono in questa situazione, quindi posso uscire con garbo dalla mia funzione. Suppongo che il modo più semplice e migliore sia quello di capire chi possiede questo puntatore e chiedergli se qualcosa è cambiato. Quindi ho intenzione di implementare una soluzione del genere. Evita qualsiasi hacker di cancellazione C++ di cui stavo discutendo.
Tuttavia, la cosa interessante è che nel nostro codice abbiamo una classe chiamata "BogusObject" che agisce essenzialmente come un vassoio che cattura persone che accidentalmente si distolgono dagli oggetti liberati. Fondamentalmente, agganciamo le nostre proprie funzioni di cancellazione e bash la classe BogusObject nel vtable di qualsiasi classe liberata.
Quindi se qualcuno chiama qualcosa riceve un bel messaggio che dice qualcosa all'effetto di "hey, qualcosa è sbagliato amico". Questo sta accadendo nel mio caso. Ad esempio, 0x604751f8+(someoffset)
si trova nella classe BogusObject. Ma non usiamo più BogusObject! Non è letteralmente impostato ovunque (anche i collegamenti correttamente se rimuovo completamente la classe BogusObject), eppure continuo a ricevere il messaggio che dice che qualcosa non va! Ma ora sono dell'opinione che sia una coincidenza.
Per qualche motivo il runtime sta mettendo il valore 0x604751f8
in questo puntatore quando viene eliminato, e ciò accade solo per corrispondere con una classe che ha lo scopo di catturare situazioni come questa!
Perché non si imposta un punto di interruzione dati sul puntatore (0x24083094) e si vede quando viene scritto 0x604751f8? Quando il debugger si rompe, esegui la scansione della pila per vedere chi ti ha chiamato e da dove proviene il valore. –
sì, l'ho fatto. Viene modificato dopo essere tornato da myModule! MyClass :: 'vettore che elimina il distruttore '. Sono entrato in ogni linea tra quando viene chiamato delete e quando cambia. In effetti, ho un registro di Windbg che mostra questo, con alcuni cambiamenti di esso. Tuttavia, ci sono molte cose della compagnia, quindi ho bisogno di scrub prima di condividere. – pj4533