Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1530 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Question existentielle : free()

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Question existentielle : free()

n°2022085
snafu8
Posté le 09-09-2010 à 14:24:49  profilanswer
 

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?

mood
Publicité
Posté le 09-09-2010 à 14:24:49  profilanswer
 

n°2022087
Un Program​meur
Posté le 09-09-2010 à 14:28:54  profilanswer
 

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


---------------
The truth is rarely pure and never simple (Oscar Wilde)
n°2022093
bjone
Insert booze to continue
Posté le 09-09-2010 à 14:47:39  profilanswer
 

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
n°2022097
h3bus
Troll Inside
Posté le 09-09-2010 à 14:56:55  profilanswer
 

bjone a écrit :


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


 [:hfrbaxter]


---------------
sheep++
n°2022098
bjone
Insert booze to continue
Posté le 09-09-2010 à 14:59:38  profilanswer
 

:D
[:tang]


Message édité par bjone le 09-09-2010 à 15:01:25
n°2022108
olivthill
Posté le 09-09-2010 à 15:25:04  profilanswer
 

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.

n°2022214
Sve@r
Posté le 09-09-2010 à 23:40:09  profilanswer
 

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.
n°2022258
olivthill
Posté le 10-09-2010 à 10:41:38  profilanswer
 

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.

n°2022285
gilou
Modérateur
Modzilla
Posté le 10-09-2010 à 12:27:43  profilanswer
 

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é!  --
n°2022375
Sve@r
Posté le 10-09-2010 à 20:28:50  profilanswer
 

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.
mood
Publicité
Posté le 10-09-2010 à 20:28:50  profilanswer
 

n°2022379
h3bus
Troll Inside
Posté le 10-09-2010 à 20:52:13  profilanswer
 

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++
n°2022383
gilou
Modérateur
Modzilla
Posté le 10-09-2010 à 21:40:32  profilanswer
 

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é!  --
n°2023175
tartopron
Tarte... au pron !
Posté le 15-09-2010 à 22:25:20  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Question existentielle : free()

 

Sujets relatifs
question sur auto_ptrFree_Will
Question de débutant en Ajaxquestion de design
question sur static et multithreadréférencer ma page perso free
question sur les char *une question de closeCursor ?
Question sur les autotools 
Plus de sujets relatifs à : Question existentielle : free()


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR