Question existentielle : free() - C - Programmation
Marsh Posté le 09-09-2010 à 14:28:54
Il l'a stocke quelque part, explicitement ou implicitement.
Marsh Posté le 09-09-2010 à 14:47:39
Pour être un peu plus explicite, le runtime maintient une structure décrivant les allocations, et souvent juste avant le bloc retourné par malloc, un pointeur ou autre truc permet de référencer l'entrée correspondante dans la dite structure, ou autre approche....
Mais le ketchup n'est pas utilisé par contre.
Marsh Posté le 09-09-2010 à 14:56:55
ReplyMarsh Posté le 09-09-2010 à 15:25:04
Oui, la taille est stockée. Et c'est pour cela qu'il faut attention à ne jamais faire deux fois appel à free() pour la même zone, car le premier free() va éliminer les informations sur le bloc alloué, ou bien va permettre qu'elles soient écrasées par autre chose, et le deuxième free() ne saura plus quoi faire.
Marsh Posté le 09-09-2010 à 23:40:09
snafu8 a écrit : Par contre, quand je veux désallouer un buffer, free se contente du pointeur vers le début, comment fait il pour savoir combien de mémoire il doit désallouer? |
Ben il n'en sait rien. En fait, free() c'est une fonction bidon qui fait que dalle
Marsh Posté le 10-09-2010 à 10:41:38
Une explication qui me parait très claire (si on comprend l'anglais) est celle qui est donnée dans l'article http://www.codeguru.com/cpp/w-p/wi [...] .php/c9535 au sujet de l'implémentation des fonctions de gestion de la mémoire pour Windows.
Le tableau montrant les octets en mémoire, avant et après un malloc et un free est assez intéressant.
Marsh Posté le 10-09-2010 à 12:27:43
snafu8 a écrit : Ma question existentielle du moment : quand je veux allouer de la mémoire, malloc (ou new) a besoin que je lui donne la taille du buffer à allouer et me renvoit le pointeur vers le début du steak. Jusque là, je vois très bien pourquoi. |
Tu as 15 chaussettes a ranger. Tu demandes au système "donnes moi un tiroir pour ranger 15 chaussettes" et le système te dit "prends le tiroir 0x36588775". Quand tu as usé toutes tes chaussettes, tu dis au système "J'ai plus besoin du tiroir 0x36588775" et non pas "J'ai plus besoin du tiroir 0x36588775 qui contient 15 chaussettes", c'est logique. Le système vide tout le tiroir (par une méthode globale quelconque: retournement du tiroir ou bien incinération du contenu, etc; bref, ça ne concerne pas le propriétaire original), sans se préoccuper de son contenu exact.
A+,
Marsh Posté le 10-09-2010 à 20:28:50
gilou a écrit : Tu as 15 chaussettes a ranger. Tu demandes au système "donnes moi un tiroir pour ranger 15 chaussettes" et le système te dit "prends le tiroir 0x36588775". Quand tu as usé toutes tes chaussettes, tu dis au système "J'ai plus besoin du tiroir 0x36588775" et non pas "J'ai plus besoin du tiroir 0x36588775 qui contient 15 chaussettes", c'est logique. Le système vide tout le tiroir (par une méthode globale quelconque: retournement du tiroir ou bien incinération du contenu, etc; bref, ça ne concerne pas le propriétaire original), sans se préoccuper de son contenu exact. |
T'as oublié de dire que quand tu demandes un espace pour "n" éléments le système te donne un "bloc". Ca se sous-entend dans ton texte mais snafu8 n'est pas obligé de le savoir...
Marsh Posté le 10-09-2010 à 20:52:13
Sve@r a écrit : |
Oui enfin il alloue une page mais au prochain malloc, si ta nouvelle demande loge dans la même page, ce coup-ci il ne t'alloue rien...
Marsh Posté le 10-09-2010 à 21:40:32
Sve@r a écrit : |
Je pensais pourtant que l'image d'un tiroir permettait de visualiser cela.
A+,
Marsh Posté le 15-09-2010 à 22:25:20
Man sbrk.
Bon je fais un effort :
En gros : Malloc stocke les informations nécessaires pour s'y retrouver dans les segments alloué (un liste chainée).
Donc adresse retournée = mon adresse de maillon + sizeof(maillon).
Free() ne fait que retirer ces maillons de la liste.
En tout cas c'est comme ca que je l'avais codé a l'époque.
Marsh Posté le 09-09-2010 à 14:24:49
Ma question existentielle du moment : quand je veux allouer de la mémoire, malloc (ou new) a besoin que je lui donne la taille du buffer à allouer et me renvoit le pointeur vers le début du steak. Jusque là, je vois très bien pourquoi.
Par contre, quand je veux désallouer un buffer, free se contente du pointeur vers le début, comment fait il pour savoir combien de mémoire il doit désallouer?