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?
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.
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.
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.
À 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.