2010-11-19 4 views
1

Je sais que ce n'est pas vraiment une nouvelle question, mais je n'ai rien trouvé d'autre qui fonctionne. J'ai un programme C qui mange régulièrement la mémoire pendant qu'elle fonctionne - j'utilise la commande 'free' pour la suivre, et je peux voir que la quantité de mémoire disponible diminue tant qu'elle s'exécute, ce qui ne devrait pas arriver . Cependant, je ne trouve rien dans le programme lui-même qui pourrait causer cela. Je l'ai également testé avec valgrind et dmalloc, et aucun d'entre eux n'est capable de détecter une perte de mémoire.détecter la fuite de mémoire dans C

Comment trouver la fuite?

+0

Etes-vous sûr de ne pas inclure de mémoire tampon dans la quantité de mémoire utilisée? Si votre programme lit des fichiers, etc., cela peut provoquer une augmentation constante, mais cette mémoire n'est pas vraiment "utilisée" dans le sens où elle deviendrait indisponible pour d'autres applications. – Arkku

+0

Je suis assez sûr. J'ai d'abord remarqué cela après avoir quitté le programme pendant deux jours, il a rempli toute la mémoire et s'est écrasé. – Benubird

Répondre

3

Si vous êtes sûr de votre utilisation de la mémoire, peut-être ce n'est pas vos mallocs et Libère qui sont le problème.

Si vous utilisez des bibliothèques, vérifiez que vous les utilisez correctement. Beaucoup ont des fonctions d'initialisation et de libération que vous pouvez facilement oublier, et donc provoquer des fuites de mémoire.

+0

Après une enquête plus approfondie, c'était le cas - tdelete ne libérait pas la mémoire utilisée par l'arbre, comme je m'y attendais. – Benubird

3

La mémoire est-elle réellement divulguée ou le programme consomme-t-il simplement plus de mémoire plus il s'exécute? En d'autres termes, le programme construit-il peut-être une grande structure de données dynamique (liste chaînée, etc.) qui continue simplement à croître? Tant que le programme a un pointeur vers la mémoire, ce n'est pas vraiment une fuite - mais si les allocations ne sont jamais libérées, chaque nouveau recevra plus de mémoire du système d'exploitation. Cela expliquerait également pourquoi les outils que vous avez utilisés n'ont signalé aucune «fuite».

Lorsque j'ai dû faire cela, j'ai fait des choses comme écrire un message dans un fichier plat chaque fois que mon programme allouait de la mémoire et le libérait. Les messages incluraient des choses comme le nom de fichier et la ligne de programme où la mémoire était allouée et l'adresse retournée par malloc lors de l'allocation de mémoire, ou encore le nom de fichier et la ligne de programme où la mémoire était libérée et l'adresse du tampon libérée. Ensuite, vous pouvez trier le fichier résultant par adresse, et ces adresses avec un message "ALLOCATE" mais pas de message "FREE" sont celles qui ont pu fuir - ou du moins n'ont pas été libérées au moment où le programme s'est terminé. Cela peut prendre du temps à mettre en œuvre et les outils automatisés sont plus agréables si vous les avez - mais en fonction de vos circonstances, vous devrez peut-être faire quelque chose comme ça. Ou, vous voudrez peut-être juste lancer et utiliser un garbage collector. Le collectionneur Boehm pourrait travailler pour vous - jetez un oeil à http://www.hpl.hp.com/personal/Hans_Boehm/gc/.

Partagez et appréciez.

+0

L'OP pourrait également essayer d'utiliser l'outil Valgrind 'massif' (plutôt que le' memcheck' par défaut), qui est un profileur de tas. Il compte la mémoire totale allouée à la partie du programme qui l'a allouée, ce qui devrait vous permettre de localiser où la mémoire est utilisée. – caf

+0

@caf - Je crois que le PO a noté qu'il avait déjà essayé valgrind et dmalloc. –

+0

L'OP a mentionné l'utilisation de Valgrind pour rechercher les fuites de mémoire, ce qui implique qu'ils ont utilisé l'outil 'memcheck'. Valgrind est en fait un paquet de plusieurs outils différents, et je suggère d'utiliser le profileur de tas 'massif' à la place (qui ne cherche pas les fuites, mais les profils de l'utilisation de la mémoire), basé sur l'idée que ce n'est pas vraiment "dans le sens classique du tout. – caf