Est-ce que exit () libère de la mémoire allouée sur _SUCCESS et _FAILURE

C’est un court extrait de code, avec deux appels à exit(3) en cas d’échec. Ces appels libèrent-ils la mémoire allouée par malloc? La recherche Google dit une fois qu’elle le fait, et encore plus souvent, elle ne le fait pas …

Dois-je append free ()?

Aussi: qu’est-ce qui est meilleur if (!word) (cela fonctionnerait également pour, par exemple, mot == 0 qui est différent de mot == NULL, donc je suppose que c’est faux) ou if (word == NULL) ?

 char *word = NULL, *temp = NULL; word = (char *)malloc(sizeof(char) * size); if (!word) { /* or maybe rather it should be (word == NULL) */ perror("malloc fail"); if (fclose(fp)) { perror("fclose fail"); exit(3); /* exit without free ? */ } exit(3); /* exit without free ? */ } 

Merci d’avance!

Oui, toute la mémoire est retournée. BTW, que voudriez-vous faire avec la mémoire restante après la sortie de toute façon?
Ou craignez-vous une fuite de mémoire dans exit() ? Si la mémoire n’était pas récupérée, cela fuirait un peu plus avec chaque processus en cours, ce que tout système d’exploitation crédible ne pourrait se permettre. Ainsi, à l’exception d’un système d’exploitation bogué, cessez de vous soucier de la mémoire et utilisez exit() partout où vous en avez besoin.

Pour répondre aux questions dans les commentaires de votre code, que ce soit gratuit, je dirais que c’est l’ingénierie logicielle appropriée d’écrire un free correspondant avec chaque malloc . Si cela semble difficile, cela indique un problème structurel dans votre code. L’avantage de libérer toute la mémoire avant de quitter est que vous pouvez utiliser des outils puissants tels que valgrind pour vérifier les memory leaks dans le rest de votre code sans faux positifs du malloc que vous nous avez montré.

Notez qu’après un malloc échoué, il ne sert à rien d’essayer de libérer le résultat – c’est quand même un pointeur nul.

Et troisièmement, je préfère if (pointer == NULL) plutôt que if (!pointer) mais cela est totalement subjectif et je peux lire et comprendre les deux 🙂

Après avoir appelé exit vous êtes déjà au-delà de malloc et de vos amis, mais le système d’exploitation récupère tout. Pensez à malloc comme un intermédiaire pratique entre le système d’exploitation et votre processus.

Notez simplement que, lors de ces 2 appels de sortie, vous n’avez alloué aucune mémoire. Libérer ce pointeur sera donc plutôt inutile (et risque de se bloquer, selon l’âge de votre système d’exécution C).

Donc, non, vous ne devriez pas le libérer, car il n’existe pas.

Je l’aurais dit dans le cas d’une erreur fatale comme celle-là, vous ne voulez probablement pas vous donner la peine de libérer de la mémoire.

Cependant, si votre programme se termine normalement, vous devriez essayer de libérer toute la mémoire que vous avez allouée. Cela peut être assez délicat parfois.

Lorsque vous quittez le programme, toute la mémoire allouée est récupérée par le système d’exploitation (à la fois la stack et le tas). Votre programme ne laisse aucune trace dans la RAM, sauf si vous travaillez en dehors de la mémoire du programme en raison de débordements de mémoire tampon, etc.