web-dev-qa-db-fra.com

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

Duplicata possible:
Libère (ptr) où ptr est une mémoire NULL corrompue?

J'écris une fonction C qui libère un pointeur s'il était malloc() ed. Le pointeur peut être NULL (dans le cas où une erreur s'est produite et le code n'a pas eu la chance d'allouer quoi que ce soit) ou alloué avec malloc(). Est-il sûr 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?

65
rid

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

void free(void *ptr);

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

Ne vérifiez pas NULL, cela ajoute seulement plus de code factice à lire et est donc une mauvaise pratique.


Cependant, vous devez toujours vérifier les pointeurs NULL lorsque vous utilisez malloc & co. Dans ce cas, NULL signifie que quelque chose s'est mal passé, très probablement qu'aucune mémoire n'était disponible.

135
orlp

Il est recommandé de ne pas prendre la peine de rechercher NULL avant d'appeler free. La vérification ajoute simplement un encombrement inutile à votre code, et free(NULL) est garanti sûr. De la section 7.20.3.2/2 de la norme C99:

La fonction libre provoque la désallocation de l'espace pointé par ptr, c'est-à-dire qu'il est disponible pour une allocation ultérieure. Si ptr est un pointeur nul, aucune action ne se produit.

20
jamesdlin

La recherche aléatoire sur Google apparaît http://linux.die.net/man/3/free qui dit:

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

5
Hello71

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

Si vous ne pouviez pas allouer de mémoire, vous auriez dû le vérifier avant l'appel de free.

4
George