2008-12-09 9 views
4

Il existe de nombreuses façons de vérifier les programmes en cas de fuite de mémoire. Vous vous retrouvez avec cette liste de pointeurs vers des blocs de mémoire qui fuient, mais y a-t-il un bon moyen de trouver plus d'informations pour chaque bloc? Par exemple: si je sais que l'objet est une chaîne, la valeur réelle de la chaîne pourrait faciliter la recherche de la fuite.Recherche du type d'un objet inconnu en C++

Y a-t-il une porte dérobée dans RTTI qui rend cela possible? Les problèmes à résoudre sont que lorsque vous obtenez les pointeurs, le système d'exécution est déjà en état d'arrêt et vous obtenez des pointeurs de blocs de mémoire brutes au lieu de pointeurs sur les objets (bien que dans de nombreux cas, cela soit identique) .

Répondre

6

RTTI peut ne pas vous aider. RTTI ne fonctionne que si les classes ont des méthodes virtuelles, et toutes les allocations ne sont pas des objets avec des méthodes virtuelles.

Ce que vous devez vraiment faire est d'avoir un moyen d'attacher une trace de pile à vos allocations. Ensuite, vous pouvez obtenir des informations sur l'emplacement de la mémoire. Vous rechercheriez un constructeur de classe s'il s'agissait d'objets ayant fui la mémoire.

Quoi qu'il en soit, y at-il quelque chose comme ça? Oui. Une bibliothèque gratuite pour Windows est Visual Leak Detector. Il y a des produits commerciaux plus complets (comme Bounds Checker, et Rational Purify d'IBM), mais VLD fonctionne très bien. Cela m'a aidé d'innombrables fois à détecter les fuites de mémoire.

5

J'utilise valgrind --leak-check = full, ce qui me donnera une trace de pile du site d'allocation de chaque bloc divulgué. Cette information est façon plus utile que de taper des informations. valgrind (prononcé comme "Val grimacé") roches!

0

comme norman je préconise pour valgrind. C'est vraiment un bon conseil pour analyser la trace de la pile!

Je l'utilise dans KDevelop.

Questions connexes