Pourquoi free () ne définit-il que les 8 premiers octets à zéro?

J’ai une question sur le comportement free ().

Juste un code simple qui utilise malloc et strcpy a char *. Donc, tout est réglé sur le HEAP:

(gdb) x/100b 0x602010 0x602010: 66 111 110 106 111 117 114 32 0x602018: 116 111 117 116 32 108 101 32 0x602020: 109 111 110 100 101 0 0 0 0x602028: 0 0 0 0 0 0 0 0 0x602030: 0 0 0 0 0 0 0 0 0x602038: 33 0 0 0 0 0 0 0 

Quand je libère le morceau avec free (), le résultat est:

 (gdb) x/100b 0x602010 0x602010: 0 0 0 0 0 0 0 0 0x602018: 116 111 117 116 32 108 101 32 0x602020: 109 111 110 100 101 0 0 0 0x602028: 0 0 0 0 0 0 0 0 0x602030: 0 0 0 0 0 0 0 0 0x602038: 33 0 0 0 0 0 0 0 

Code simple pour prouver que:

 int main () { const char * str = "Bonjour tout le monde"; char *ptr = (char *) malloc (strlen(str) + 1); strcpy(ptr, str); printf("*ptr : %s\n\n", ptr); free(ptr); printf ("After free ptr = %p\n", ptr); printf ("Content ptr : %s\n", ptr); printf ("Content ptr+8 : %s\n", ptr+8); return 0; } 

Sortie:

 *ptr : Bonjour tout le monde After free ptr = 0x13c7010 Content ptr : Content ptr+8 : tout le monde 

Est-ce que quelqu’un a la réponse?

free() n’est pas nécessaire pour effacer la mémoire, et cela ne devrait vraiment pas l’être, car cela prendrait du temps et écraserait les données en cache sans aucun avantage universellement requirejs.

Il est certainement permis d’utiliser l’espace interne à ses propres fins. Ce que vous voyez peut n’être qu’un effet secondaire du fait que l’allocateur garde la trace de la mémoire disponible.

Une meilleure question serait; pourquoi pensez-vous qu’il devrait faire autre chose? Où avez-vous trouvé de la documentation concernant la mise en œuvre obligatoire de free ? Cela n’existe pas, il est donc insensé de poser une telle question.

free doit simplement marquer cette mémoire comme libérée. Qu’advient-il de ce bloc de mémoire après avoir appelé free n’est pas spécifié.


En passant, c’est UB:

 printf ("Content ptr : %s\n", ptr); printf ("Content ptr+8 : %s\n", ptr+8);