Que signifie “double”?
Comme le suggère le titre, je suis nouveau sur C et une à mi-parcours à venir sous peu. Je suis la révision du passé papiers actuellement et un thème récurrent est le double problème. Je comprends que c'est le processus de l'appel free()
sur le même emplacement de mémoire deux fois, mais j'ai un couple de questions que je ne suis pas 100% sûr de la façon de répondre:
Question 1: Quel est le résultat d'un double en C, et pourquoi est-ce un problème?
Ce sera la cause d'une double gratuit:
char* ptr = malloc(sizeof(char));
*ptr = 'a';
free(ptr);
free(ptr);
Ma réponse à ce serait, serait-il de retour d'un 0x0 adresse de mémoire et de provoquer une instabilité du système/panne. Aussi, si je me souviens bien, un double peut réellement appeler malloc
deux fois, ce qui entraîne un dépassement de la mémoire tampon laissant ainsi le système vulnérable.
Quelle serait la meilleure façon de résumer d'un mot à cette question?
Question 2: Décrire une situation dans laquelle il est particulièrement facile d'introduire une
double gratuit en C?
Je pense que lorsque le passage de pointeurs autour de vous risquez de le libérer dans une fonction, et aussi libre de nouveau sans s'en rendre compte?
Encore une fois, quelle est la "meilleure" façon de résumer cela?
"...would it return a 0x0 memory address..."
- c'est à quel sujet? Serait - ce de retour d'un 0x0 adresse de mémoire? Fonction free
ne retourne rien.OriginalL'auteur chris edwards | 2014-01-11
Vous devez vous connecter pour publier un commentaire.
Un double en C, techniquement parlant, conduit à comportement indéfini. Cela signifie que le programme peut se comporter de manière totalement arbitraire et tous les paris sont ouverts sur ce qui se passe. C'est certainement une mauvaise chose d'avoir lieu! Dans la pratique, la double libération d'un bloc de mémoire, au risque de corrompre l'état du gestionnaire de mémoire, ce qui pourrait provoquer des blocs de mémoire pour obtenir endommagé ou pour des affectations futures à l'échec de façon bizarre (par exemple, la même mémoire remis à deux appels successifs de
malloc
).Double libère peut se produire dans toutes sortes de cas. Assez commun est lorsque plusieurs objets différents ont tous des pointeurs de l'un à l'autre et de commencer à être nettoyé par des appels à
free
. Lorsque cela se produit, si vous n'êtes pas prudent, vous pourriezfree
le pointeur de même à plusieurs reprises lors du nettoyage d'objets. Il y a beaucoup d'autres cas, bien que.Espérons que cette aide!
OriginalL'auteur templatetypedef
Parce que free() permettra de consolider les régions adjacentes par la gestion de l'information stockée dans les balises avant chaque région. C'est quelque chose comme la gestion de la double liste chaînée. Donc, il serait dangereux si la mémoire tampon où
ptr
de pointage a été remplacé par une attaque de la chaîne, dans laquelle des faux balises peuvent être injectés.OriginalL'auteur zero_yu
Cette question a été bien répondu, mais j'ai ajouter une réponse tardive due à un "double question", qui demande "comment l'éviter?"
Une ligne est ajoutée à l'exemple de code posté.
Fonction
free
ne fait rien avec unNULL
pointeur.OriginalL'auteur Weather Vane
Comme par publié C11 standard, appelant
free
déjàfree
emplacement de mémoire conduit à un comportement indéterminé. Elle peut conduire à des situations bizarres, telles que la mémoire ne se allouée même quand il est disponible, le tas se corrompre, même emplacement de mémoire se alloués aux différents mallocs etc. Fondamentalement, il n'est pas défini et peut être n'importe quoi.ANSI C11 mst peuvent être trouvés ici. https://www.iso.org/obp/ui/#iso:std:iso-iec:9899:ed-3:v1:en
EDIT: modification de la valeur NULL déjà
free
d, basée sur les commentaires. aussi, le lien pointe désormais à la norme ISO/IEC 9899:2011(fr)"Double libre" et "gratuit sur NULL" sont deux questions distinctes. Le premier est un comportement indéfini, mais la seconde est un danger non-op.
Êtes-vous sûr que c'est correct? Le projet de norme ISO, j'ai explicitement dit que l'appel
free
sur un pointeur null n'a aucun effet.je suis désolé. mon mauvais. signifiait doublement gratuit. introduit quelques modifications à l'original de la réplique. aussi @templatetypedef nom d'utilisateur vérifie.
OriginalL'auteur ankurgupta7