Ne free(ptr) où ptr est NULLE corruption de la mémoire?
Théoriquement je peux dire que
free(ptr);
free(ptr);
est une corruption de la mémoire puisque nous sommes libérer la mémoire qui a déjà été libérée.
Mais que faire si
free(ptr);
ptr=NULL;
free(ptr);
Que l'OS va se comporter d'une manière indéfinie, je ne peut pas obtenir une réelle analyse théorique de cette sur ce qui se passe.
Tout ce que je fais, est-ce une corruption de mémoire ou pas?
Est de libérer un pointeur NULL est-il valide?
- pas sûr au sujet de C gratuit standard, mais en C++ supprimer(NULL) est parfaitement valide, donc je suppose que free(NULL) doit l'être également.
delete NULL
n'est pas valide en C++. suppression peut être appliquée à de pointeur null valeurs de type de béton, mais de ne pasNULL
.delete (int*) NULL
est légal, mais pasdelete NULL
.- donc, cela signifie que si un pointeur pointe vers NULL gratuit ne pas effectuer quoi que ce soit.est-ce à dire!!!!!! chaque fois, dans notre codage si souhaitez libérer de la mémoire peut tout simplement remplacer un free(ptr) avec ptr=NULL?
- Pas de. Si
ptr
points à la mémoire, et vous n'appelez pasfree
, la mémoire de la fuite. Le paramètreNULL
perd tout votre poignée sur la mémoire, et les fuites. Si leptr
arrive à êtreNULL
, appelantfree
est un non-exploitation. - Hein? De ce fait à vous de conclure que l'on peut remplacer
free(ptr)
avecptr = NULL
. Personne n'a dit quoi que ce soit. - gratuit ne signifie pas libre de la variable passée dans, il libère un bloc de mémoire précédemment alloués et référencé par le pointeur de la valeur dans la valeur transmis. Donc, ptr n'est pas libéré, le bloc pointé par ptr est libéré.
- Dupliquer: stackoverflow.com/questions/1879550/...
Vous devez vous connecter pour publier un commentaire.
Voir ISO-IEC 9899.
Cela étant dit, quand on regarde les différentes bases de codes dans la nature, vous remarquerez que parfois les gens font:
C'est parce que certains C temps de fonctionnement (I pour vous rappelez-vous c'était le cas sur PalmOS) crash lors de la libération d'un
NULL
pointeur.Mais aujourd'hui, je crois qu'il est sûr de supposer
free(NULL)
est un nop en suivant les instructions de la norme.free(ptr)
oùptr
est nul a pas d'effets secondaires. Mais en tout cas, toute la mémoire allouée à l'aide d'malloc()
oucalloc()
doit être publié par la suite en utilisantfree()
free(NULL)
en testant le pointeur contreNULL
avant d'appelerfree()
Tous conformes aux normes les versions de la bibliothèque C de traiter gratuit(NULL) comme un no-op.
Cela dit, à un moment il y avait certaines versions de free qui s'écrasera sur le libre(NULL), qui est pourquoi vous pouvez voir certains défensive des techniques de programmation recommandons:
NULL
ptr et le traiter comme un nop. Drepper personnellement s'oppose à la plus sûre des fonctions de chaîne, de sorte que la glibc ne sera probablement jamais être conforme.dit la documentation.
Je me souviens de travail sur PalmOS où
free(NULL)
s'est écrasé.NULL
est l'un des grands cours d'exécution différences de la Paume boîte à outils par rapport à la bibliothèque standard.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.
Recommandé d'utilisation:
Voir:
Lorsque vous réglez le pointeur de
NULL
aprèsfree()
vous pouvez appelerfree()
encore et aucune opération ne sera effectuée.free(NULL)
est parfaitement légal en C ainsi quedelete (void *)0
etdelete[] (void *)0
sont légaux en C++.BTW, la libération de la mémoire deux fois provoque généralement une sorte d'erreur d'exécution, afin de ne pas endommager quoi que ce soit.
delete 0
n'est pas légal en C++.delete
exige explicitement une expression de type pointeur. Il est légal d'appliquerdelete
à une tapée de pointeur null valeur, mais de ne pas0
(et de ne pasNULL
).void*
soit 😛 Qui destructeurs(s) devrait-il exécuté?void *
tant qu'il est un pointeur null.buf1=malloc(X); free(buf1);buf2=malloc(X);free(buf1);
- ici si vous êtes malchanceux, buf2 eu exactement la même adresse que buf1, et vous avez accidentellement libéré buf1 deux fois, sur 2 gratuit de buf1 vous réellement libérés buf2 silencieusement, sans casuing tout (immidate) erreur/panne/quoi que ce soit. (mais vous aurez encore probablement obtenir un crash prochaine fois que vous essayez d'utiliser buf2 - et ce scénario est très peu probable si vous êtes en cours d'exécution sur l'ASLR)free(ptr) est de sauvegarder en C si le pointeur est NULL, cependant, que la plupart des gens ne savent pas est que NUL besoin de ne pas être égal à 0. J'ai une belle vieille école exemple: Sur le C64, sur l'adresse 0, il y a un IO-Port. Si vous avez écrit un programme en C d'accéder à ce port, vous auriez besoin d'un pointeur dont la valeur est de 0. Le correspondant de la bibliothèque c devra distinguer entre 0 et NULL.
Salutations
pas de corruption de la mémoire, mais le comportement dépend de la mise en œuvre.
En standard, il faut un code juridique.
ptr pointe sur un emplacement mémoire, permet de dire 0x100.
Lorsque vous free(ptr), en gros, vous permettant 0x100 à être utilisé par le gestionnaire de mémoire pour être utilisé pour d'autres activité ou d'un processus et dans des mots simples, il est la libération des ressources.
Lorsque vous ne ptr=NULL, vous vous ptr point à un nouvel emplacement(permet de ne pas vous soucier de ce que NULL est). Ce faisant, vous avez perdu la trace de la 0x100 de données de la mémoire.C'est ce qui est fuite de mémoire.
De sorte qu'il n'est pas conseillé d'utiliser ptr=NULL sur un pointeur valide.
Au lieu de cela, vous pourriez faire quelques sûr de vérifier à l'aide de :
if(ptr != NULL)
{free(ptr);}
Lorsque vous free(ptr) où ptr est d'ores et déjà orienté à la valeur NULL, il n'effectue aucune opération.Donc, il est sécuritaire de le faire.