IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Allocation - Libération


Sujet :

C

  1. #1
    Membre émérite Avatar de |PaRa-BoL
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 738
    Par défaut Allocation - Libération
    Bonjour,

    Je me posais une petite question.
    Lors de l'appel de malloc() celui ci nous renvois l'adresse du premier élement de la mémoire que l'on a demandé d'allouée.

    Lors de l'appel de free() on passe ce meme premier element pour libérer la mémoire.

    Mais comment free() sait combien de place il faut libérer ? La taillé allouée est stocké quelque part ? Il libère jusqu'à tomber sur une zone spéciale ?

    Comment cela se passe t'il concrètement en bas niveau ?

    Merci

  2. #2
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    C'est interne à l'implémentation de la gestion de la mémoire - pour l'utilisateur, c'est une boite noire qui fonctionne par magie !
    Typiquement, l'implémentation peut choisir de:
    • stocker la taille d'un bloc alloué avant ou après le bloc (la mémoire utilisée est donc un peu plus grande que celle demandée);
    • stocker la taille dans le pointeur retourné (si c'est possible);
    • utiliser des blocs de taille prédéterminée.

    Il y a d'autres possibilités, c'est un sujet assez vaste. Remarque que le C ne normalise que le comportement externe de malloc() et free(). La bidouille interne est laissée à l'implémentateur.

  3. #3
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par |PaRa-BoL Voir le message
    Lors de l'appel de malloc() celui ci nous renvois l'adresse du premier élement de la mémoire que l'on a demandé d'allouée.
    Non. Il renvoi l'adresse du bloc mémoire alloué. Il n'a aucune notion "d'éléments".
    Lors de l'appel de free() on passe ce meme premier element pour libérer la mémoire.
    Non. On passe l'adresse du bloc à libérer.
    Mais comment free() sait combien de place il faut libérer ? La taillé allouée est stocké quelque part ? Il libère jusqu'à tomber sur une zone spéciale ?

    Comment cela se passe t'il concrètement en bas niveau ?
    Bah, ça dépend de l'implémentation. Il y a différentes techniques. Je crois me souvenir que dans le K&R, il y a un exemple d'allocateur...
    (K&R2 : 8.7)

  4. #4
    Membre émérite Avatar de |PaRa-BoL
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 738
    Par défaut
    # stocker la taille d'un bloc alloué avant ou après le bloc (la mémoire utilisée est donc un peu plus grande que celle demandée);
    Donc en gros un buffer overflow peux écraser cette donnée ?

    Vous savez comment c'est utilisé sur les architecture Linux (libc) ? Windows ?

    Merci

  5. #5
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par |PaRa-BoL Voir le message
    Donc en gros un buffer overflow peux écraser cette donnée ?
    Un buffer overflow provoque un comportement indéterminé. Tout peut arriver.
    Vous savez comment c'est utilisé sur les architecture Linux ? Windows ?
    Non. Quelle importance ?

  6. #6
    Membre émérite Avatar de |PaRa-BoL
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 738
    Par défaut
    Non. Quelle importance ?
    Par curiosité ?

    Et sinon parce que j'ai une fuite de mémoire sous Windows dans un programme alors que cela ne se passe pas sous Linux.
    Je fait qu'une seule allocation dans une boucle mais qui est bien libérer à chaque fois. Mais entre les deux je fait pas mal de traitement sur le buffer et je voulais simplement savoir vers quelle direction me tourner.

    Voila

  7. #7
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Sous linux, l'entête est codé sous forme d'un long (incrémenté de 1) précédant directement l'adresse de la zone alloué .
    Sous windows, on la trouve dans les 4 bits de poids faible d'une zone de 8 bits directement avant l'adresse de la zone alloué. Sous windows il ya une fonction qui permet de lire cette valeur (cf MSDN) , sous linux on peut faire quelque chose comme ça : *(int*)p-1 mais c'est risqué, l'implémentation est suceptible de changer n'importe quand, aussi le résultat n'est pas garanti.
    Cordialement.

  8. #8
    Membre émérite Avatar de |PaRa-BoL
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 738
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    Sous linux, l'entête est codé sous forme d'un long (incrémenté de 1) précédant directement l'adresse de la zone alloué .
    Sous windows, on la trouve dans les 4 bits de poids faible d'une zone de 8 bits directement avant l'adresse de la zone alloué. Sous windows il ya une fonction qui permet de lire cette valeur (cf MSDN) , sous linux on peut faire quelque chose comme ça : *(int*)p-1 mais c'est risqué, l'implémentation est suceptible de changer n'importe quand, aussi le résultat n'est pas garanti.
    Cordialement.
    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 17
    Dernier message: 10/04/2013, 18h46
  2. Réponses: 15
    Dernier message: 10/06/2008, 15h20
  3. Allocation - Libération de mémoire
    Par Denn's dans le forum MFC
    Réponses: 5
    Dernier message: 15/10/2007, 12h07
  4. Réponses: 6
    Dernier message: 07/07/2007, 18h12
  5. Réponses: 8
    Dernier message: 14/12/2006, 23h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo