From f7007bbc8d759ab20cea036d6e90e270a74b81ac Mon Sep 17 00:00:00 2001 From: Mylloon Date: Fri, 24 Dec 2021 00:24:33 +0100 Subject: [PATCH] fix memory leak when allocating space for the tree --- arbre.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/arbre.c b/arbre.c index 2e42029..8fc87ee 100644 --- a/arbre.c +++ b/arbre.c @@ -9,7 +9,6 @@ void listeVersArbre(Liste *liste) { printf("Impossible d'allouer de la mémoire supplémentaire (listeVersArbre).\n"); // gestion de l'erreur exit(1); } - /* TODO: TROUVER UN ENDROIT Où FREE CETTE NOUVELLE CELLULE A L'AVENIR */ nouvelleCellule->gauche = curseur; // membre gauche = curseur nouvelleCellule->droite = curseur->suivant; // membre droit = élément suivant dans la liste @@ -18,7 +17,6 @@ void listeVersArbre(Liste *liste) { curseur = curseur->suivant->suivant; // on va au suivant 2x car on a déjà ajouté le suivant en tant que membre droit - /* TODO: FUITE ICI ?? */ *liste = curseur; // on change le point de départ de notre liste pour ne pas traiter en boucle les anciennes cellules ajouterRangee(liste, nouvelleCellule); // on ajoute à la liste notre nouvelle cellule curseur = *liste; // on met à jour le curseur @@ -46,6 +44,15 @@ void assignationCode(Arbre arbre, int codeActuel, int longueur, Lettre *lettresL } } +void freeArbre(Arbre arbre) { + if (arbre->lettre == '\0') { // free aussi les mini-racines + freeArbre(arbre->gauche); + freeArbre(arbre->droite); + } + + free(arbre); // free du noeud courant +} + Lettre * arbreVersListe(Arbre arbre, int taille, int *tailleTotale) { Lettre *lettres; if ((lettres = (Lettre*)malloc(taille * sizeof(Lettre))) == NULL) { // on alloue la liste qui va contenir nos caractères @@ -54,7 +61,7 @@ Lettre * arbreVersListe(Arbre arbre, int taille, int *tailleTotale) { } int i = 0; // initialisation de `i` au début car `assignationCode` est récursif assignationCode(arbre, '\0', 0, lettres, &i, tailleTotale); // on commence avec une racine nulle et une taille de 0 - free(arbre); + freeArbre(arbre); return lettres; }