Théoriquement je peux dire que
free(ptr);
free(ptr);
est une corruption de mémoire puisque nous libérons la mémoire déjà libérée.
Mais si
free(ptr);
ptr=NULL;
free(ptr);
Comme le système d'exploitation se comportera de manière indéfinie, je ne peux pas obtenir d'analyse réelle sur ce qui se passe. Quoi que je fasse, cette mémoire est-elle corrompue ou non?
La libération d'un pointeur NULL est-elle valide?
7.20.3.2 La fonction
free
Synopsis
#include <stdlib.h> void free(void *ptr);
La description
La fonction
free
provoque la désallocation de l’espace pointé parptr
, c’est-à-dire qu’il est disponible pour une affectation ultérieure. Siptr
est un pointeur null, aucune action n'est exécutée.
Voir ISO-IEC 9899 .
Cela dit, lorsque vous examinez différentes bases de code dans la nature, vous remarquerez que les gens le font parfois:
if (ptr)
free(ptr);
Ceci est dû au fait que certaines exécutions en C (je me souviens certainement que c'était le cas sous PalmOS) se bloquaient lors de la libération d'un pointeur NULL
.
Mais de nos jours, je crois qu’il est prudent de supposer que free(NULL)
est un nop comme indiqué par la norme.
Toutes les versions conformes à la norme de la bibliothèque C traitent gratuitement (NULL) comme non-op.
Cela dit, à une époque, il y avait des versions de free qui plantaient sur free (NULL), c'est pourquoi certaines techniques de programmation défensive peuvent être recommandées:
if (ptr != NULL)
free(ptr);
Si ptr est NULL, aucune opération n'est effectuée.
dit la documentation.
Je me souviens d’avoir travaillé sur PalmOS où free(NULL)
s’est écrasé.
Utilisation recommandée:
free(ptr);
ptr = NULL;
Voir:
man free
The free() function deallocates the memory allocation pointed to by ptr.
If ptr is a NULL pointer, no operation is performed.
Lorsque vous définissez le pointeur sur NULL
après free()
, vous pouvez y appeler à nouveau free()
et aucune opération ne sera effectuée.
free(ptr);
ptr=NULL;
free(ptr);/*This is perfectly safe */
Vous pouvez supprimer en toute sécurité un pointeur NULL. Aucune opération ne sera effectuée dans ce cas. En d'autres termes, free () ne fait rien sur un pointeur NULL.
free(NULL)
est parfaitement légal en C, tout comme delete (void *)0
et delete[] (void *)0
sont légaux en C++.
BTW, libérer de la mémoire deux fois provoque généralement une sorte d'erreur d'exécution, donc il ne corrompe rien.
free (ptr) est enregistré en C si ptr est NULL, cependant, ce que la plupart des gens ne savent pas, c'est que NULL n'a pas besoin d'être égal à 0. J'ai un bel exemple old-school: Sur le C64, sur l'adresse 0, il est un IO-Port. Si vous écrivez un programme en C accédant à ce port, vous aurez besoin d’un pointeur de valeur 0. La bibliothèque c correspondante devra alors faire la distinction entre 0 et NULL.
Sincères amitiés
pas la corruption de la mémoire, mais le comportement dépend de la mise en œuvre. En standard, cela devrait être un code légal.