2008-11-25 8 views
1

Chers g ++ hackers, j'ai la question suivante.Question sur le code généré par g ++

Lorsque certaines données d'un objet sont écrasées par un programme défectueux, pourquoi le programme échoue-t-il finalement à la destruction de cet objet avec une double erreur libre? Comment sait-il si les données sont corrompues ou non? Et pourquoi cela entraîne-t-il une double libération?

+0

s'il vous plaît choisir un titre plus descriptif – hop

+0

hop, s'il vous plaît suggérer un, je vais changer. – grigy

+0

Que diriez-vous de "pourquoi détruire un objet corrompu provoque une erreur sans double-g ++?" –

Répondre

3

Généralement, la mémoire de l'objet n'est pas écrasée, mais une partie de la mémoire est en dehors de l'objet. Si cela frappe les structures de contrôle de malloc, le libre arbitre flippe une fois qu'il y accède et essaie de faire des choses bizarres basées sur la structure corrompue.

Si vous ne remplissiez réellement que la mémoire d'objet avec des trucs stupides, malloc/free ne saurait en aucun cas le savoir. Votre programme peut tomber en panne, mais pour d'autres raisons.

Jetez un oeil à valgrind. C'est un outil qui émule le processeur et surveille chaque accès mémoire pour détecter les anomalies (comme essayer d'écraser les structures de contrôle de malloc). Il est vraiment facile à utiliser, la plupart du temps vous commencez simplement votre programme à l'intérieur de valgrind en ajoutant valgrind sur le shell, et cela vous fait beaucoup de mal.

En ce qui concerne C++: toujours assurez-vous d'utiliser new conjointement avec delete et, respectivement, new [] en conjonction avec delete []. Ne les mélange jamais. De mauvaises choses arriveront, souvent semblables à ce que vous décrivez (mais valgrind vous préviendra).

Questions connexes