web-dev-qa-db-fra.com

Est-ce que free (ptr) où ptr est NULL a corrompu la mémoire?

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?

103
Vijay

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é par ptr, c’est-à-dire qu’il est disponible pour une affectation ultérieure. Si ptr 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.

210
Gregory Pakosz

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);
20
R Samuel Klatchko

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

dit la documentation.

12

Je me souviens d’avoir travaillé sur PalmOS où free(NULL) s’est écrasé.

10
jlru

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.

9
stefanB
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.

8
Prasoon Saurav

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.

6
n0rd

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

3
andi8086

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.

0
Pavel Radzivilovsky