Bonjour à tous,
Je suis confronté à un problème que je n'arrive pas à résoudre, je viens donc humblement vous demander votre aide.
J'ai fait un programme (pour mon stage) évaluant des opérations logiques (avec des XOR/AND/OR...) d'arité (= nombre d'arguments pris par chaque opérateur) quelconque mais fixe (je veux dire que si j'évalue une fois avec une arité de 3, durant toute l'exécution l'arité sera de 3).
J'utilise ce programme notamment dans des cas assez particuliers (des permutations circulaires de fonctions XOR, cela est en lien direct avec des réseaux d'automates ou des graphes ou chaque noeud vérifier une fonction XOR d'arité k si ça parle à certains...)
Le fonctionnement du programme est le suivant:
-Je lis les opérations souhaitées dans un fichier. les fichiers ont une syntaxe du type XOR ARG1 ARG2 ARG3
-je les stocke dans une liste
-je transfère la liste dans un arbre
-j'évalue cet arbre (à k fils si k est l'arité)
-je renvoie le résultat en l'écrivant dans un fichier texte
J'utilise pour simuler mes noeuds (ou automates) des champs de bits (un int donc 32 bits, bien que je n'ai pas eu à aller au delà de 13 bits pour le moment).
Mon problème est le suivant:
Lors de l'exécution du programme, j'ai de nombreux malloc/calloc et free (pour générer mes listes, mes arbres...). Je m'efforce de faire un free pour chaque allocation, mais il semblerait que j'en oublie car valgrind m'indique que des bytes sont perdus ou encore alloués:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 HEAP SUMMARY: ==7508== in use at exit: 27,525,120 bytes in 589,824 blocks ==7508== total heap usage: 1,417,220 allocs, 827,396 frees, 61,211,724 bytes allocatedToujours d'après valgrind, les bytes ont été alloués par ma fonction de création d'arbre appelée par ma fonction plaçant les valeurs d'une suite dans un arbre. J'ai fait une fonction de suppression d'un arbre qui, lorsque je l'exécute seule dans un fichier à part, semble bien libérer toute la mémoire (valgrind me dit que tout va bien).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 LEAK SUMMARY: ==7508== definitely lost: 1,572,856 bytes in 196,607 blocks ==7508== indirectly lost: 25,950,584 bytes in 393,201 blocks ==7508== possibly lost: 1,548 bytes in 14 blocks ==7508== still reachable: 132 bytes in 2 blocks ==7508== suppressed: 0 bytes in 0 blocks
Je ne comprends donc pas d'où viennent ces bytes non libérés, et je viens vous demander votre aide à ce sujet.
Ci joint mon code commenté, auquel j'ai supprimé les fonctions ne modifiant pas la mémoire. S'il n'est pas clair, je suis ouvert à toute remarque de structuration/présentation/commentaire, ça me fera progresser (c'est le but d'un stage non ?) et essaierai du mieux que je pourrai de vous aider à m'aider.
Veuillez par ailleurs m'excuser pour toute faute d'orthographe, si je ne poste pas au bon endroit et si mon code est trop long/pas clair/mal fait. C'est la première fois que je demande de l'aide sur un forum, et également la première fois que j'ai à réaliser un "vrai" programme que quelqu'un d'autre devra comprendre et utiliser.
Merci de votre aide !
[EDIT]: bon et bien une fois de plus, compiler PUIS modifier le code n'est pas une bonne idée. il manque la fonction "evaluer" pour que le programme puisse marcher, je la rajoute donc bien qu'elle ne soit pas directement intéressante ici
Partager