2016-10-21 3 views
0

J'ai couru quelques tests en essayant de comprendre comment fonctionne la fonction free(). Voici mon code suivi de quelques questions basées sur ce que j'ai compris.Besoin d'aide pour essayer de comprendre comment fonctionne la fonction libre() en C

int n=0,i=0; 
scanf("%d",&n); 
int *A = (int*)malloc(n*sizeof(int)); 
for (i=0;i<n;i++) 
{ 
    A[i]=2*i; 
    printf("A[%d] = %d\n",i,*(A+i)); 

} 
printf("Address of A is = %d\n",A); 
free(A); 
for (i=0;i<n;i++) 
{ 
    printf("%d\n",*(A+i)); 

} 
printf("Address of A is = %d\n",A); 

Ce que je ne comprends pas pourquoi après free(A), les valeurs de A sont toujours les mêmes? Ne devrait-il pas y avoir une certaine valeur de déchets après libre? Et pourquoi l'adresse de A est-elle restée la même? Qu'est-ce qui s'est vraiment passé après avoir libéré A en termes de mémoire?

+0

Pourquoi ne le devraient-ils pas? Si vous mettez des déchets dans la boîte, ils ne disparaissent pas avant que le chariot ne les enlève, ou que le voisin ne les remplace par des pierres. 'free' ne supprime pas délibérément la mémoire qui est libérée. Cela arrive quand un autre processus est assigné la même mémoire. Aussi l'adresse de 'A' reste la même. 'free' ne peut pas changer cela. Si vous voulez l'invalider, vous devez assigner 'A = NULL'. –

+0

Mais ce que je ne comprends pas, c'est pourquoi vous accédez à la mémoire que vous avez dit que le système n'est plus le vôtre, et attendez des résultats significatifs. –

+2

Pourquoi voudriez-vous que la mémoire change? Si vous prenez un morceau de papier à partir d'un bloc-notes, écrivez une note dessus, puis jetez le papier dans la poubelle, l'écriture sur la note ne disparaît pas comme par magie de la page. –

Répondre

3

free retourne la mémoire sur le tas. Il ne dit rien de ce qu'il fait du contenu de la mémoire, et en fait, le comportement habituel est "il ne fait rien" (c'est-à-dire qu'il n'effectue aucune lecture ou écriture des données elles-mêmes, juste des mises à jour l'information de suivi de tas pour marquer cette mémoire comme étant disponible pour la réutilisation ou la renvoie à l'OS).

Vous ne devez pas compter sur ce bien; use-after-free est un comportement non défini, donc il peut faire tout ce qu'il veut. Dans la pratique, la lecture d'importantes allocations immédiatement après la libération sera la faute probable seg, alors que les petites allocations continueront à travailler jusqu'à ce que les nouveaux malloc s réutiliser l'espace, mais vous ne pouvez pas compter sur tout cela, et il est système et utiliser modèle spécifique.

Si vous accédez à free d la mémoire, vous le faites mal, et il finira par vous mordre.