85 votes

Est-ce une bonne pratique afin de libérer un pointeur NULL en C?

Double Possible:
Ne free(ptr) où ptr est NULLE corruption de la mémoire?

Je suis en train d'écrire une fonction C qui libère un pointeur si elle a été malloc()ed. Le pointeur peut être NULLE (dans le cas où une erreur s'est produite et le code n'a pas la chance d'attribuer quoi que ce soit) ou attribué malloc(). Est-il sécuritaire d'utiliser free(ptr); au lieu de if (ptr != NULL) free(ptr);?

gcc ne se plaint pas du tout, même avec -Wall -Wextra -ansi -pedantic, mais est-ce une bonne pratique?

163voto

nightcracker Points 34498

Citant le C standard, 7.20.3.2/2 de la norme ISO-IEC 9899:

void free(void *ptr);

Si ptr est un pointeur null, aucune action ne se produit.

Ne pas vérifier les NULL, cela ne fait qu'ajouter plus de code factice à lire et est donc une mauvaise pratique.


Cependant, vous devez toujours vérifier pour NULL des pointeurs lors de l'utilisation d' malloc & co. Dans ce cas NULL signifie que quelque chose allait mal, plus que probable qu'aucun mémoire n'a été disponible.

26voto

jamesdlin Points 13455

Il est de bonne pratique pour ne pas les déranger vérifiant NULL avant d'appeler free. Vérification ajoute simplement inutiles de votre code, et free(NULL) est garanti pour être sûr. À partir de la section 7.20.3.2/2 du standard C99:

La fonction libre provoque l'espace pointé par ptr pour être libéré, c'est fait disponible pour plus d'allocation. Si ptr est un pointeur null, aucune action ne se produit.

6voto

Hello71 Points 545

Au hasard googler tourne http://linux.die.net/man/3/free qui stipule:

Si ptr est NULLE, aucune opération n'est effectuée.

4voto

George Points 2224

À mon avis, non, du moins pas dans votre cas.

Si vous n'avez pas à allouer de la mémoire, vous devez vérifier de cette FAÇON avant l'appel de gratuit.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X