10
votes

Libérer la mémoire qui a été allouée à un tableau de pointeurs de char (chaînes). Dois-je libérer chaque chaîne ou juste le pointeur "principal"?

J'ai une fonction qui prend un pointeur sur un char * ** et le remplit de chaînes (une gamme de cordes je suppose). * list_of_strings * est une mémoire allouée à l'intérieur de la fonction. XXX

Comment allez-vous libérer la mémoire après avoir utilisé les cordes? Si j'appelle xxx

ne sera-t-il pas que libérer les pointeurs et non la mémoire que chaque chaîne elle-même utilisait? Comment puis-je libérer complètement la mémoire

juste pour clarté que la fonction ressemble à ceci: xxx


2 commentaires

Vous avez une fuite de mémoire: * (liste + i) = quelque_string_from_somewhere écrase le pointeur obtenu à partir de MALLOC.


C'est un bon point. Vous devez utiliser quelque chose comme Strcpy / Strncpy / Autre alternative à la copie de la chaîne. Personnellement, je recommanderais d'utiliser quelque chose comme Snprintf si, sans autre raison que cela ne vous oblige à évaluer vos hypothèses.


4 Réponses :


4
votes

Oui, vous devez gratuit () chaque bloc que vous avez obtenu à partir de MALLOC () . Vous le faites en parcourant la gamme de pointeurs et de Calage gratuit () sur chaque élément et libérant uniquement le tableau lui-même.

Seulement vous savez qu'il existe une structure semblable à une arbre qui pourrait être libérée de récursivitée, que la connaissance n'est nulle part dans le tas d'exécution C. Le gestionnaire de démarrage n'a donc aucune idée de cela et votre programme doit tout libérer.


0 commentaires

16
votes

ne sera pas que libérer les pointeurs et non la mémoire que chaque chaîne elle-même utilisait?

Oui, en effet.

Comment puis-je complètement libérer la mémoire

en boucle via la matrice et libérant chaque chaîne une par une avant libérant le tableau lui-même. E.g. xxx


0 commentaires

2
votes

Vous devez itérer sur list et appelez gratuit () sur chaque membre de la matrice. Alors libérez le tableau.


0 commentaires

7
votes

Fondamentalement, il y a une règle générale pour allouer et libérer: vous devez appeler autant de libres () que vous appelez MALLOC (). C'est aussi simple que ça. Dans tous les autres cas, vous avez une fuite de mémoire.


0 commentaires