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'utiliserfree(ptr);
au lieu deif (ptr != NULL) free(ptr);
?
gcc
ne se plaint pas du tout, même avec-Wall -Wextra -ansi -pedantic
, mais est-ce une bonne pratique?
Réponses
Trop de publicités?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.
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.
Au hasard googler tourne http://linux.die.net/man/3/free qui stipule:
Si ptr est NULLE, aucune opération n'est effectuée.