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 pasdelete 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 ?
4 votes
Non. Si
ptr
pointe vers la mémoire, et vous n'appelez pasfree
sur elle, alors la mémoire va fuir. En le réglant surNULL
perd juste la main sur la mémoire, et fuit. Si leptr
se trouve êtreNULL
en appelantfree
est une non-opération.2 votes
@benjamin : Huh ? Qu'est-ce qui vous a fait conclure que vous pouvez remplacer
free(ptr)
conptr = NULL
. Personne n'a rien dit de tel.0 votes
@benjamin : free ne libère pas la variable passée, il libère une bloc de mémoire précédemment alloué et référencé par la valeur du pointeur dans la valeur passée. Donc, ptr n'est pas libéré, c'est le bloc pointé par ptr qui est libéré.
0 votes
Duplicata : stackoverflow.com/questions/1879550/