-
Detected memory leaks
Bonjour,
Dans un programme, j'ai un petit soucis. Il plantait, non pas à la compilation, mais à l'execution quand j'appuyais sur un bouton (c'est su Visual C++). Je me suis rendu compte que tout ca à cause d'une variable qui s'amuse à changer de valeur comme bon lui semble. Et j'ai ensuite decouvert dans l'output Debug de VS 2010 :
Detected memory leaks!
Dumping objects ->
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {829} normal block at 0x057004C8, 40 bytes long.
Data: < S > B4 A6 B5 53 17 00 00 00 17 00 00 00 01 00 00 00
c:\sources\liberrormsg.cpp(263) : {827} normal block at 0x0075C088, 12 bytes long.
Data: < p S> 00 00 00 00 D8 04 70 05 C8 A6 B5 53
Object dump complete.
Si j'ai bien compris, j'ai une fuite memoire. Est ce la cause du faite que ma variable change de valeur comme ca ? Ou c'est completement different ?
Et dans tous les cas, comment y remedier ?
Merci :)
-
En général, c'est lié à un pointeur mal géré (les pointeurs nus, c'est le mal), ou surtout à un débordement de tableau.
Dans le cas du tableau, passer par vector et surtout sa fonction at() plutot que [] permet de ne pas accéder en dehors de la mémoire.
Par ailleurs, il faut toujours veiller à ce que les variables soient initialisées avant d'être lues.
Je t'invite à activer un maximum de warning de compilation: dans visual, c'est /W4 dans les propriétés du projet.
-
Même en activant /W4, il n'y a pratiquement aucun warning (juste 3, 4 mais c'est rien). Il y a pas un moyen de voir toutes les variables declarées/utilisées/... lors de l'execution avec Visual Studio ? Car il y a enormement de fichier et j'en ai pour 1 semaine pour verifier chaques variables :? , surtout que c'est pas moi qui ai codé ce logiciel..
-
utiliser un débugger, et surtout DrMemory / Valgrind (deux programmes de vérification de la mémoire). Cela dit, je ne connais pas ces derniers.
-
Est ce que par hasard cela peut venir d'un dépassement de lecture dans un fichier (si on continue a essayer de lire alors qu'il n'y a plus rien) ?
Car j'ai trouvé une boucle plutôt louche qui lit dans un fichier :?
-
Je conseilles également un bon petit coup de DrMemory,il va te donner plein d'infos sur ce qui cloche et t'orienter vers la partie du code qui pose problème. Valgrind est super mais ne fonctionne pas sous windows.
-
Je viens d'utiliser Dr Memory mais je sais pas trop comment interpreter les résultats :? . Je poste le "FINAL RESULT" :
FINAL SUMMARY:
DUPLICATE ERROR COUNTS:
SUPPRESSIONS USED:
ERRORS FOUND:
0 unique, 0 total unaddressable access(es)
1 unique, 1 total uninitialized access(es)
3 unique, 3 total invalid heap argument(s)
0 unique, 0 total GDI usage error(s)
0 unique, 0 total handle leak(s)
0 unique, 0 total warning(s)
0 unique, 0 total, 0 byte(s) of leak(s)
0 unique, 0 total, 0 byte(s) of possible leak(s)
ERRORS IGNORED:
309 potential error(s) (suspected false positives)
(details: C:\XX\AppData\Roaming\Dr. Memory\DrMemory-RiffEdit.exe.4868.000\potential_errors.txt)
680 potential leak(s) (suspected false positives)
(details: C:\XX\AppData\Roaming\Dr. Memory\DrMemory-RiffEdit.exe.4868.000\potential_errors.txt)
3 unique, 3 total, 316 byte(s) of still-reachable allocation(s)
(re-run with "-show_reachable" for details)
Details: C:\XX\AppData\Roaming\Dr. Memory\DrMemory-RiffEdit.exe.4868.000\results.txt
Voilà. Au vu du nombre de potential error, je me doute qu'il y a des choses à regler, mais bon... Je peux poster le fichier potential_errors.txt mais il est vraiment vraiment long :?
-
Ce sont surtout les vraies erreurs qu'il faut corriger. Tout particulièrement la "1 unique, 1 total uninitialized access(es)".
Il y a toutes les chances que ce soit le pointeur en cause.
Quand aux "3 unique, 3 total invalid heap argument(s)", je ne sais pas ce que c'est.
Cela dit, je n'ai jamais utilisé DrMemory, je ne peux pas t'en dire plus.
-
Ne te préoccupe pas des potentials en effet, pas pour le moment. Regarde dans le reste du fichier, tu devrais avoir des callstacks qui te montrent dans quel fichier et à quel ligne le problème est rencontré. Si tu n'as pas ces infos, vérifie que tu es bien en debug.
-
Bonjour,
Tu as pu corriger ton erreur ?
Autrement tu pourrais nous en dire plus sur ton programme ? J'ai eu une erreur similaire il y a peu de temps, j'avais simplement oublié de supprimer un pointeur déclaré dans une méthode d'une de mes classes... A chaque appel de ma méthode on s'approchait un peu plus du précipice.
Ça vaut ce que ça vaut, mais ça pourrait être une éventualité.
-
Bonsoir,
un outil assez sympa a utiliser pour l'analyse dynamique, Visual Leak detector. Tous simple inclure vld.h dans le main, exécuter son programme et visual leak detector générera un rapport à la fin de l'exécution.