140 votes

Est-ce que free(ptr) où ptr est NULL corrompt 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 qui a déjà été libérée.

Mais si

free(ptr);
ptr=NULL;
free(ptr); 

Comme le système d'exploitation se comporte de manière indéfinie, je ne peux pas obtenir une analyse théorique réelle de ce qui se passe. Quoi que je fasse, est-ce une corruption de la mémoire ou non ?

La libération d'un pointeur NULL est-elle valide ?

1 votes

Je ne suis pas sûr de la norme C free, mais en C++ delete(NULL) est parfaitement valide, donc je suppose que free(NULL) devrait l'être aussi.

15 votes

@Pryank : delete NULL n'est pas valide en C++. delete peut être appliqué à des valeurs de type concret de type null-pointer, mais pas à NULL . delete (int*) NULL est légal, mais pas delete NULL .

0 votes

Cela signifie donc que si un pointeur pointe vers NULL, free ne fait rien. Cela signifie-t-il que ! !!!!! chaque fois que nous codons, si nous voulons libérer une mémoire, nous pouvons simplement remplacer free(ptr) par ptr=NULL ?

255voto

Gregory Pakosz Points 35546

7.20.3.2 Le free fonction

Synopsis

#include <stdlib.h> 
void free(void *ptr); 

Description

El free fait en sorte que l'espace pointé par ptr pour être désaffecté, c'est-à-dire rendu disponible pour une nouvelle allocation. Si ptr est un pointeur nul, aucune action ne se produit.

Ver ISO-IEC 9899 .

Cela dit, en observant différentes bases de code dans la nature, vous remarquerez que les gens le font parfois :

if (ptr)
  free(ptr);

C'est parce que certains runtimes C (je me rappelle certainement que c'était le cas sur PalmOS) se plantaient lors de la libération d'un fichier de type NULL pointeur.

Mais de nos jours, je crois qu'il est sûr de supposer que free(NULL) est un nop, conformément aux instructions de la norme.

0 votes

Cela signifie donc que si un pointeur pointe vers NULL, free ne fait rien. Cela signifie-t-il que ! !!!!! chaque fois que nous codons, si nous voulons libérer une mémoire, nous pouvons simplement remplacer free(ptr) par ptr=NULL ?

34 votes

Non, ptr=NULL n'est en aucun cas un remplacement de free(ptr), les deux sont complètement différents.

10 votes

NON, cela signifie free(ptr) donde ptr est nulle n'a aucun effet secondaire. Mais dans tous les cas, toute mémoire allouée en utilisant malloc() o calloc() doit être libéré ensuite en utilisant free()

29voto

R Samuel Klatchko Points 44549

Toutes les versions de la bibliothèque C conformes aux normes traitent free(NULL) comme un no-op.

Cela dit, à un moment donné, il y avait des versions de free qui plantaient sur free(NULL), c'est pourquoi vous pouvez voir certaines techniques de programmation défensives recommandées :

if (ptr != NULL)
    free(ptr);

10 votes

-1 [citation nécessaire]. Changer le style de code à cause d'une théorie d'une implémentation archaïque par ouï-dire est une mauvaise idée.

47 votes

@Tomas - Je n'ai jamais recommandé de changer de style, j'ai simplement expliqué pourquoi vous pouvez encore voir cette recommandation dans certains styles.

5 votes

@Tomas 3BSD ( winehq.org/pipermail/wine-patches/2006-October/031544.html ) et PalmOS pour deux (2ème main pour les deux).

13voto

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

indique la documentation.

0 votes

Vous voulez dire que free ne fera rien ?

2 votes

Benjamin, c'est exactement ce que ça veut dire. Que voulez-vous qu'il fasse s'il est conscient de la nullité de l'argument ?

12voto

jlru Points 171

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

4 votes

Intéressant - cela fait une deuxième plateforme (après 3BSD) qui se plante.

2 votes

Si je me souviens bien, sur Palm, la bibliothèque standard C n'existait pas. À la place, il y avait un fichier d'en-tête non pris en charge qui mappait les appels de la bibliothèque standard vers le SDK du Palm OS. Beaucoup de choses se sont comportées de manière inattendue. Plantage sur NULL était l'une des grandes différences de fonctionnement de la boîte à outils Palm par rapport à la bibliothèque standard.

0 votes

PalmOS était indépendant C et n'avait donc aucune obligation de fournir la bibliothèque C standard. Son analogue à free ( MemPtrFree ) n'était pas conforme aux normes, et free a été aliasé en MemPtrFree comme une tentative (grossière) de fournir une norme comme API.

9voto

Prasoon Saurav Points 47488
free(ptr);
ptr=NULL;
free(ptr);/*This is perfectly safe */

Vous pouvez supprimer un pointeur NULL en toute sécurité. Aucune opération ne sera effectuée dans ce cas. En d'autres termes, free() ne fait rien sur un pointeur NULL.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X