Où devrais-je appeler la fonction Free ()?

Par exemple:


En ca:

Head init(){ Head treeHead; treeHead = malloc(sizeof (struct TreeHead)); treeHead->Root = malloc(sizeof (struct TreeNode)); return treeHead;} 

En Bc:

 Head treeHead; treeHead = init(); 

Devrais-je appeler free dans la méthode init () dans Ac ou Bc?

Je définirais une fonction dans Ac:

 void freeHead(Head head){ free(head->Root); free(head); return; } 

Puis appelez-le aux endroits appropriés en Colombie-Britannique:

 freeHead(head); 

free est appelé lorsque vous ne voulez plus ou n’avez plus besoin de la mémoire allouée, c’est-à-dire lorsque vous avez terminé avec TreeHead et TreeNode. Il serait stupide de libérer la mémoire dans init() , car vous n’avez encore rien fait avec.

Il n’y a pas de règle absolue ici, si ce n’est que vous pouvez appeler free () avant le retour de init (), car le pointeur de retour sera alors invalide.

C’est un excellent exemple de la façon dont le C ++ est tellement meilleur pour ce genre de choses. Si vous devez utiliser C, vous pouvez appeler free () depuis l’un ou l’autre emplacement, en fonction de ce qui semble avoir le meilleur sens.

Je placerais l’appel free() dans le module qui a appelé l’appel correspondant malloc() / calloc() . Dans votre cas, “Ac” a fourni une fonction pour allouer de la mémoire à un object Head . Il devrait y avoir une fonction correspondante pour effacer la mémoire qui était allouée auparavant également dans “Ac”.

Cela n’a aucun sens de libérer la mémoire qui m’a été fournie des bibliothèques non standard (c’est-à-dire du code tiers) lorsque je suis le consommateur de cette bibliothèque. Il peut y avoir d’autres mémoires allouées à cet object auxquelles je n’ai pas nécessairement access, en particulier pour les types de données opaques .

par exemple,

MyType.c:

 typedef struct _MyType { char *name; /* fields are "private" */ ... } *MyType; /* opaque type "MyType" */ MyType MyType_create(void) { MyType ret = malloc(sizeof *ret); ret->name = malloc(...); return ret; } void MyType_delete(MyType obj) { free(obj->name); free(obj); } 

Programme.c:

 typedef void *MyType; int main(void) { MyType obj1 = MyType_create(); /* we have an "instance" of MyType */ MyType_delete(obj1); /* delete it */ MyType obj2 = MyType_create(); /* we have an "instance" of MyType */ free(obj2); /* uh oh, what happened to the memory allocated for obj2->name? leak */ } 

Voir aussi un autre exemple .