Question existentielle : free()

Question existentielle : free() - C - Programmation

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?

Reply

Marsh Posté le 09-09-2010 à 14:24:49   

Reply

Marsh Posté le 09-09-2010 à 14:28:54    

Il l'a stocke quelque part, explicitement ou implicitement.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

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.

Message cité 1 fois
Message édité par bjone le 09-09-2010 à 14:48:50
Reply

Marsh Posté le 09-09-2010 à 14:56:55    

bjone a écrit :


Mais le ketchup n'est pas utilisé par contre.


 [:hfrbaxter]


---------------
sheep++
Reply

Marsh Posté le 09-09-2010 à 14:59:38    

:D
[:tang]


Message édité par bjone le 09-09-2010 à 15:01:25
Reply

Marsh 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.

Reply

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 [:petrus75] :sol:


Message édité par Sve@r le 09-09-2010 à 23:40:25

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

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.

Reply

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.
 
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?

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+,

Message cité 1 fois
Message édité par gilou le 10-09-2010 à 13:31:42

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

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.
A+,


 
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...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 10-09-2010 à 20:28:50   

Reply

Marsh Posté le 10-09-2010 à 20:52:13    

Sve@r a écrit :


 
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...


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...


---------------
sheep++
Reply

Marsh Posté le 10-09-2010 à 21:40:32    

Sve@r a écrit :


 
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...

Je pensais pourtant que l'image d'un tiroir permettait de visualiser cela.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

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.


Message édité par tartopron le 15-09-2010 à 22:30:14

---------------
Return -1
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed