Qu’advient-il des données en mémoire libérées par free ()?

Qu’advient-il des données présentes dans un emplacement mémoire qui vient d’être libéré par un free() ? Ces données sont-elles également supprimées et la mémoire va maintenant avoir une valeur de déchets? Ou que les données persistent jusqu’à ce qu’une nouvelle donnée soit stockée dans cet emplacement de mémoire (à l’avenir)?

Je veux dire, pour le code ci-dessous:

 int *ptr; ptr = malloc(sizeof(int)); *ptr = 1; // Suppose ptr = 2000 //Free now free(ptr); // My question is what is the value stored in memory address 2000 now ? // Is it still '1' or some garbage value ? 

Le résultat est imprévisible. Plusieurs options peuvent se présenter. Le fait est que vous ne pouvez compter sur aucun comportement de la mémoire libérée par free()

Quelques exemples:

  • la mémoire peut être intacte (rest la même que c’est avec les mêmes données).
  • Il peut être atsortingbué à une autre allocation de mémoire, auquel cas il peut être écrit à tout moment.
  • Il peut être mis à zéro.
  • La page contenant la mémoire peut être renvoyée au système d’exploitation, en la supprimant de la mappe de mémoire de votre processus et en provoquant le blocage de votre programme si vous essayez d’y accéder.

Que la valeur soit écrasée ou non est indéfini. Une fois que free est appelé, il est permis de laisser la mémoire telle quelle ou de l’écraser, mais si vous êtes intéressé par la sécurité, vous devez l’écraser vous-même avant de la désallouer. En parlant de désallocation, free n’a pas à redonner la mémoire au système d’exploitation, mais dans de nombreux cas, ce ne sera pas le cas, mais la mémoire restra allouée à votre programme afin que la prochaine fois que vous appelez malloc il puisse restituez simplement la même mémoire et évitez de faire plus d’appels système, car le temps nécessaire à l’allocation de mémoire par le système d’exploitation est généralement considéré comme une utilisation moins efficace des ressources que le programme qui conserve un peu plus de mémoire qu’il n’en a besoin.

Je sais qu’en utilisant la fonction C free (), la mémoire utilisée est libérée, mais ni le pointeur, ni la valeur contenue dans la mémoire ne sont modifiés! free () indique seulement que la mémoire peut être utilisée à d’autres fins. (Il est possible que certaines bibliothèques implémentent la mémoire libérée ou la valeur du pointeur, mais cela ne devrait pas être la norme!)

J’ai essayé le code ci-dessous avec gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2

 int main(void) { int *i,j; i=malloc(100*sizeof(int)); for(j=0;j<100;j++) i[j]=j+1; printf("%p %d\n",i,i[0]); free(i); printf("%p %d\n",i,i[0]); return 0; } 

Les résultats de sortie (comme je m'y attendais) sont:

 0x1de2010 1 0x1de2010 1 

Malloc () est une fonction de bibliothèque. La réponse dépend de la manière dont la bibliothèque est mise en œuvre.

La plupart (sinon tous) mallocs préfixent un en-tête au bloc de mémoire renvoyé. Ceci est généralement modifié.

Certains mallocs ajoutent une bande-annonce au bloc de mémoire et y écrivent quelque chose. Ceci est utilisé pour détecter les dépassements de mémoire tampon.

Certains frees () écraseront l’écriture dans la mémoire renvoyée avec un modèle de bits pour détecter les écritures ultérieures.

Il existe de nombreux mallocs que vous pouvez télécharger et associer à votre application afin que vous puissiez obtenir pratiquement tous les comportements souhaités en liant le malloc que vous souhaitez à votre application.

Cela dépend du compilateur. Si vous utilisez gcc, la valeur libre de cette mémoire devient 0.

Voici un exemple de code:

 #include #include int main ( void ) { int *ptr = NULL; ptr = malloc (sizeof(int)); *ptr = 5; printf ( "\n value of *ptr = %d", *ptr ); free ( ptr ); printf ( "\n value of *ptr = %d", *ptr ); return ( 0 ); } 

o / p:

 ./a.out value of *ptr = 5 value of *ptr = 0 ./a.out value of *ptr = 5 value of *ptr = 0 ./a.out value of *ptr = 5 value of *ptr = 0 

Déréférencer un pointeur free conduit à un comportement indéfini, ce qui signifie que tout est permis.

Il est fort probable que vous obtiendrez une valeur inutilisable, mais vous pourrez également déclencher une erreur de segmentation, ce qui provoquera un blocage du programme. Malgré tout, aucun de ces comportements n’est garanti et vous ne devriez pas compter sur eux.