Libération de la mémoire allouée à un tableau de pointeurs de caractères (chaînes). Dois-je libérer chaque chaîne ou juste le pointeur «principal»?

J’ai une fonction qui prend un pointeur sur un caractère ** et le remplit de chaînes (un tableau de chaînes, je suppose). * list_of_ssortingngs * est alloué de la mémoire à l’intérieur de la fonction.

char * *list_of_ssortingngs = NULL; /* list_of_ssortingngs malloc'd inside function */ fill_ssortingngs_with_stuff(&list_of ssortingngs); use_list_for_something(list_of_ssortingngs); /* Now how do I free it all? */ 

Comment pourrais-je libérer la mémoire après avoir utilisé les chaînes? Si j’appelle

 free(list_of_ssortingngs); 

cela ne va-t-il pas simplement libérer les pointeurs réels et non la mémoire que chaque chaîne utilisait elle-même? Comment libérer complètement la mémoire

Juste pour la clarté, la fonction ressemble à ceci:

 fill_ssortingngs_with_stuff(char *** list) { *list = malloc(AMOUNT); for (i = 0; i < SOMETHING; i++) { *(list + i) = malloc(LINE_LEN); *(list + i) = some_string_from_somewhere } /* ... */ } 

cela ne va-t-il pas simplement libérer les pointeurs réels et non la mémoire que chaque chaîne utilisait elle-même?

Oui en effet.

Comment libérer complètement la mémoire

En parcourant le tableau et en libérant chaque chaîne une par une avant de libérer le tableau lui-même. Par exemple

 for (i = 0; i < SOMETHING; i++) { free(list[i]); } free(list); 

En gros, il existe une règle empirique pour allouer et libérer: Vous devez appeler autant de free () que vous avez appelé malloc (). C’est aussi simple que ça. Dans tous les autres cas, vous avez une fuite de mémoire.

Oui, vous devez free() chaque bloc obtenu avec malloc() . Vous le faites en parcourant le tableau de pointeurs et en appelant caling free() sur chaque élément, puis en libérant le tableau lui-même.

Vous êtes le seul à savoir qu’il existe une structure arborescente pouvant être libérée de manière récursive, cette connaissance n’étant nulle part dans le tas d’exécution C, le gestionnaire de tas n’a aucune idée de cela et votre programme doit tout libérer lui-même.

Vous devez parcourir la list et appeler free() sur chaque membre du tableau. Libérez ensuite le tableau.