libérer un pointeur nul

Que se passe-t-il dans la mémoire si nous essayons de libérer un pointeur qui pointe vers NULL? Est-ce que c’est jamais valable?

Pourquoi ne montre-t-il aucun message d’avertissement / d’erreur?

De la section C99, section 7.20.3.2: la fonction libre

Synopsis

1 #include  void free(void *ptr); 

La description

2 La fonction free 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 .

De http://linux.die.net/man/3/malloc :

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

libérer le pointeur nul n’aura aucun effet dans l’exécution.

Il y a très longtemps, il y avait des implémentations de ‘free ()’ qui se bloquaient lorsqu’un pointeur null donnait free. Ceci ne s’applique qu’aux implémentations antérieures à la norme C89 (C90) qui n’ont pas été modifiées pour traiter le problème depuis.

D’après mon expérience, il ne rest essentiellement aucune de ces implémentations (et il ne devrait pas en être non plus). Il est donc maintenant sûr de libérer les pointeurs nuls.

Si vous avez des exigences en matière de portage sur des systèmes extrêmement étranges et anciens, vous devriez peut-être restr prudent. D’un autre côté, si vous aviez des problèmes avec de tels systèmes, vous seriez probablement au courant du problème (et de toute une série d’autres problèmes) – ou il y aurait une certaine connaissance de la communauté autour du code qui l’indique.

J’irais pour:

 #ifdef MY_DOUBTS_HAUNT_ME_IN_MY_DREAMS #define safe_free(x) do { if ((x)) free((x)); } while(0) #elseif /* feeling gutsy */ #define safe_free(x) free((x)) #endif 

; – ||

Que se passe-t-il dans la mémoire si nous essayons de libérer un pointeur qui pointe vers NULL? est-ce que c’est jamais valable?

Rien.

pourquoi ne montre-t-il aucun message d’avertissement / d’erreur?

Tout d’abord, le comportement est valide par définition, aussi aucune erreur ni aucun avertissement ne doit être émis.

Deuxièmement, un pointeur pointe vers NULL au moment de l’exécution. Comment un message d’avertissement ou d’erreur doit-il être affiché, voire pas du tout? Imaginez que vous jouiez à un jeu appelé Kill the Zombie et que deux de ces êtres vous attaquent, un message d’erreur contextuel s’affiche et indique: “Attention, le pointeur NULL est libéré.”

Cela pourrait être sûr (je ne le savais pas, mais les autres réponses semblent le suggérer), mais je ne vais pas tomber dans l’habitude de ne pas me soucier de savoir si le pointeur est déjà nul. L’affectation p = NULL; après chaque libre suit bientôt comme corollaire. Cela est dangereux dans les applications multithreads, car après cette affectation, p pourrait être utilisé par un autre thread et serait libéré à nouveau par le thread actuel alors qu’il est supposé être actif par les autres threads.

Chaque mémoire malloc’d devrait être libérée une fois. Période.