2012-06-12 3 views
3

Je sais qu'un pointeur invalide conduit à un comportement indéfini mais comment savoir si un pointeur est valide ou non?Comment free() 'savoir' que le pointeur passé est valide?

Y a-t-il une sorte de somme de contrôle au début de chaque bloc dans la liste libre? quelque chose comme:

if((*ptr) == 'CHECKSUM')) 
    free 
else 
    do something undefined 
+4

Habituellement, il ne sait pas, et vient de se bloquer (ou corrompt quelque chose). –

+0

Trouver la réponse à votre question ici http://stackoverflow.com/questions/1119134/how-do-malloc-and-free-work – Viswesn

+0

Il n'a pas à savoir. Tout le point est qu'il est permis de supposer que l'argument est soit nul (dans ce cas, il ne fait rien) ou un pointeur vers un objet obtenu par (ou comme si par) «malloc». –

Répondre

5

Je sais qu'un pointeur invalide conduit à un comportement non défini, mais comment ne sait libre si un pointeur est valide ou non?

La seule vérification est de savoir si le pointeur est nul ou non. Si c'est un pointeur nul, free (par spécification) ne fera rien.

Sinon, free essaie juste de « libre » de la mémoire, en faisant l'hypothèse qu'il a la mémoire allouée par malloc, calloc ou realloc, ce qui peut faire quelque chose arrive (les choses généralement mauvaises) - d'où « un comportement non défini. »

+0

oh c'était rapide :) merci. – ubuntumazze

+0

C'est pourquoi c'est une bonne idée de toujours placer votre pointeur sur NULL immédiatement après l'avoir libéré. –

2

Il ne sait pas. Il suppose juste qu'il est valide et agit de manière appropriée.

Si cette supposition était fausse, la destruction de structures importantes pourrait avoir eu lieu - et ce qui se passe alors, n'est pas connu. Ainsi, le comportement indéfini.

4

Il pourrait y avoir. Mais en général, ce n'est pas le cas. Pour de nombreuses implémentations, free suppose simplement que son entrée est valide et laboure droit devant comme si c'était vrai. C'est parfaitement dans son droit de le faire.

C'est pourquoi le comportement est "indéfini": il est impossible de prédire ce qui se passera si le pointeur n'est pas valide. Des zones aléatoires de la mémoire peuvent être saccagées pendant l'opération free et/ou plus tard lorsqu'une autre opération de tas est exécutée; potentiellement conduire à un comportement imprévisible dans un code sans rapport. Le programme peut se bloquer immédiatement en free, ou plus tard dans certains endroits apparemment sans rapport.

1

Étant donné que le pointeur est invalide, free essaie de lire les « informations de maintien de la livre » comme si le pointeur a été retourné par malloc et valide, ce qui conduit généralement à libérer une adresse aléatoire pointée par ce pointeur invalide, ce qui conduit à la corruption/crash

Questions connexes