Domanda

Cari hacker g ++, ho la seguente domanda.

Quando alcuni dati di un oggetto vengono sovrascritti da un programma difettoso, perché il programma alla fine fallisce alla distruzione di quell'oggetto con un doppio errore libero? Come fa a sapere se i dati sono danneggiati o no? E perché causa il doppio libero?

È stato utile?

Soluzione

Di solito non è che la memoria dell'oggetto sia sovrascritta, ma una parte della memoria esterna all'oggetto. Se questo colpisce le strutture di controllo di malloc, il libero arbitrio impazzirà una volta che le accederà e proverà a fare cose strane in base alla struttura corrotta.

Se davvero sovrascrivi solo la memoria degli oggetti con cose stupide, non c'è modo che malloc / free lo sappia. Il tuo programma potrebbe bloccarsi, ma per altri motivi.

Dai un'occhiata a valgrind . È uno strumento che emula la CPU e controlla ogni accesso alla memoria per anomalie (come cercare di sovrascrivere le strutture di controllo di malloc). È davvero facile da usare, la maggior parte delle volte che avvii il tuo programma all'interno di valgrind anteponendo valgrind sulla shell e ti fa risparmiare molto dolore

Riguardo a C ++: sempre assicurati di usare new insieme a delete e, rispettivamente, new [] insieme a delete []. Non confonderli mai. Accadranno cose brutte, spesso simili a ciò che stai descrivendo (ma Valgrind ti avvertirebbe).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top