2010-01-19 3 views
2

J'ai un programme de ligne de commande C pour lequel j'utilise la fonction calloc() pour affecter de la mémoire à une structure qui a aussi une structure avec de la mémoire assignée.Libérer de la mémoire après utilisation

Si j'utilise la fonction free() pour libérer la mémoire de la structure parente, va-t-elle également libérer la mémoire de la structure enfant? Ou devrais-je libérer la mémoire de la structure enfant en premier?

+0

un peu lié: http://stackoverflow.com/questions/1941323/always-check-malloced-memory – jldupont

+0

avez-vous également utilisé calloc/malloc pour la structure de l'enfant? – quinmars

+0

Si vous avez utilisé calloc() sur la structure enfant, vous devez utiliser free() sur cette mémoire. Sinon, au fur et à mesure de l'exécution de votre programme, il prendra de plus en plus de mémoire. (Si votre programme ne fait pas grand-chose avant de quitter, ce n'est pas vraiment important, mais si vous le faites en boucle, vous pourriez même planter.) – egrunin

Répondre

13

C'est une règle simple, pour chaque allocation de mémoire que vous faites, vous devez explicitement libérer la mémoire vous-même. Donc, vous devez libérer la mémoire de l'enfant vous-même.

+6

Vous devez au moins saisir les pointeurs sur la mémoire enfant avant de libérer la structure parente - pour s'assurer que le code n'a pas accès à la mémoire libérée. Alternativement, il suffit de libérer les structures de l'enfant avant les parents - un cas de traversée après l'ordre de toutes les structures d'arbres que vous avez. –

6

Non, vous devez d'abord libérer la mémoire de l'enfant.

0

Cela dépend de ce qui arrive à la structure après la libre. Tant qu'une structure n'est pas référencée après free() tout va bien. Si free est appelé et que du code fait référence à la mémoire libérée, des choses très difficiles à déboguer peuvent se produire. Ne fais pas le dernier.

0

Il n'est peut-être pas nécessaire de libérer de la mémoire, car toute la mémoire allouée est libérée à la fin du programme. Vous devez seulement appeler free() si vous souhaitez économiser l'utilisation de la mémoire.

+0

Que faire si la structure parent est créée et supprimée dans une boucle? – egrunin

0

Je pense qu'il vaut la peine de mentionner que, pour les outils de ligne de commande de courte durée, cela n'a pas souvent d'importance. Une fois que votre programme est terminé, le système d'exploitation récupérera toute la mémoire, de toute façon. Cependant, s'il s'agit d'un outil qui fonctionne pour une durée indéterminée, vous devez vous soucier de la gestion de la mémoire, et les autres réponses ont de bons conseils.

+5

Je pense que c'est un mauvais conseil de dire 'laissez l'OS s'en occuper', même si c'est pour un petit programme. Vous ne voulez pas prendre l'habitude d'écrire du code qui fuit. – Trent

1

Toujours libérer les structures enfant en premier. Il peut être judicieux d'écrire des fonctions qui permettront de libérer chaque type de structure pour simplifier la vie plus loin dans la ligne. Si structTypeA contient structTypeB et StructTypeC, cela vous permet d'appeler simplement freeStructTypeA (pointeur vers sTA-instance) et de faire en sorte que la fonction prenne soin de libérer toutes les structures enfant avant de libérer structTypeA elle-même. Sur une note connexe, vous feriez bien d'essayer d'exécuter votre code via valgrind pour vous assurer que vous libérez toute votre mémoire correctement.

+0

Je suis complètement d'accord. Si une structure contient des enfants alloués dynamiquement, il est généralement plus facile d'écrire une fonction pour gérer la libération de la structure et de tous les objets enfants associés. – bta

Questions connexes