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 et free d'un double pointeur.


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 118
    Points : 40
    Points
    40
    Par défaut Allocation et free d'un double pointeur.
    Bonjour,

    Je voudrais savoir se qu'il se passe lorsque l'on malloc. Je sais que l'orsque l'on malloc il y à une limite et que l'on repousse cette limite en malloquant. J'ai un peu de mal à visialiser la chose.

    Pour l'exemple d'un char**, si je voulais malloc une grille pour un tetris, ce que je faisais était:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    char **tab;
    int i = 0;
     
    tab = malloc(20*sizeof(char*));
    while (i < 20)
    {
      tab[i] = malloc(10*sizeof(char));
      i++;
    }
    Et si je dois free:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    while (i < 20)
     free(tab[i++]);
    free(tab);
    Le problème c'est que les "mini" malloc, ce de ma boucle sont, selon moi, des adresse à l'intérieur de mon adresse renvoyé par le gros malloc. Donc si je free le gros malloc je devrait aussi free ce à l'intérieur de celui-ci.

    Merci de bien vouloir m'expliquer la chose.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 374
    Points : 23 632
    Points
    23 632
    Par défaut
    Bonsoir,

    Citation Envoyé par shirohige Voir le message
    Bonjour, Je voudrais savoir se qu'il se passe lorsque l'on malloc. Je sais que l'orsque l'on malloc il y à une limite et que l'on repousse cette limite en malloquant. J'ai un peu de mal à visialiser la chose.
    « malloc » signifie simplement « memory allocation » et sert uniquement à allouer n octets de mémoire consécutifs. Cette fonction te renvoie alors un pointeur qui t'indique où se trouve la mémoire que tu as réclamée.

    La seule véritable raison, au moins au départ, qui oblige le programme à faire cela est permettre au système de tenir à jour la liste des applications qui utilisent la mémoire (même s'il n'y en a qu'une seule) pour éviter qu'elles se marchent dessus et que lui-même n'utilise que de la mémoire réputée libre.

    Pour l'exemple d'un char**, si je voulais malloc une grille pour un tetris, ce que je faisais était:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    char **tab;
    int i = 0;
     
    tab = malloc(20*sizeof(char*));
    while (i < 20)
    {
      tab[i] = malloc(10*sizeof(char));
      i++;
    }
    Ton premier malloc alloue de la place pour vingt pointeurs qui — eux — ne vont servir qu'à recevoir les adresses renvoyées par tes mallocs suivants. Tu aurais pu tout aussi bien déclarer un tableau avec « char * tab[20] ». Ils se seraient alors automatiquement retrouvés dans la pile et tu n'aurais pas eu besoin du tout du premier malloc.

    On alloue des pointeurs de la sorte dans deux cas :
    • Soit tu ne connais pas à l'avance (comprendre : à la compilation) le nombre de pointeurs dont tu as besoin. Tu peux cependant recourir aux VLA mais ils n'existent que depuis C99 ;
    • Soit tu as besoin d'un très grand nombre de pointeurs et dans ce cas, il faut passer par un appel au système lui demandant explicitement de mobiliser une grande partie de la mémoire et de s'organiser en conséquence. Autrement, toutes les variables locales que tu déclares vont automatiquement dans la pile qu'il faut s'efforcer de solliciter le moins possible. C'est une sorte de « facilité de caisse » qui est utilisé par toutes les ressources de ton programme, qui plante en cas de dépassement.


    Et si je dois free:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    while (i < 20)
     free(tab[i++]);
    free(tab);
    Le problème c'est que les "mini" malloc, ce de ma boucle sont, selon moi, des adresse à l'intérieur de mon adresse renvoyé par le gros malloc. Donc si je free le gros malloc je devrait aussi free ce à l'intérieur de celui-ci.
    Non, car les différents appels à malloc sont complètement indépendants entre eux : tu as le droit de réclamer une première page de mémoire puis, plus tard, une seconde sans avoir à libérer la première. Il y a d'ailleurs des chances que le système la place complètement ailleurs en mémoire. Et comme dit juste au dessus, les pointeurs que tu as alloués ne sont là que pour recevoir le résultat de malloc. Il n'y a donc aucune notion d'imbrication à ce niveau.

    Si tu libères les pointeurs en premier, tu perds l'information qu'ils contiennent. Et si tu n'as pas demandé au système de libérer ce qu'ils pointent auparavant, il n'y a aucune raison pour qu'il le fasse avant la fin du programme. Cela s'appelle une « fuite de mémoire » parce que si tu continues à en allouer d'autres au cours de son exécution, tu vas finir par l'épuiser entièrement.

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2010
    Messages
    434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2010
    Messages : 434
    Points : 654
    Points
    654
    Par défaut
    Bonsoir,

    Alors un malloc te permet d'allouer de la mémoire ou de réserver de la mémoire.

    Dans ton tu as un pointeur de pointeur.

    Un pointeur est une variable qui contient une adresse.

    En gros imagine une tableau avec des case, l'adresse et en gros la coordonnée de ta case.

    Maintenant si ont reprends ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tab = malloc(20*sizeof(char*));
    la tu alloue un tableau de 20 case si tu fait tab[0] tu regarde dans la première case.
    quand tu fait ça tu va voir ce qui est contenu dans la première cas et la sur un char** tu vas encore tomber sur une adresse mémoire ou rien si il n'y a eu aucune allocation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    while (i < 20)
    {
      tab[i] = malloc(10*sizeof(char));
      i++;
    }
    La tu parcours le premier niveau pour venir allouer un tableau de 10 case maintenant qui va contenir des caractères.
    Ensuite pour parcourir ces tableaux le principe reste le même.

    Le malloc lui te réserve un bout de mémoire équivalent à la taille du type fois le nombre de case que tu désire.

    En gros le coup du tableau c'est pour t'aider a visualiser la chose en esperant que ça ne te perd pas

    Le gros malloc en gros initialise le premier niveau et les petits malloc initialise ce qui est à l'intérieur.

    Bonne soirée

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2012
    Messages : 118
    Points : 40
    Points
    40
    Par défaut
    Ok, merci pour vos réponses c'est claire maintenant.

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

Discussions similaires

  1. allocation dynamique avec double pointeur ou non
    Par Blackbull dans le forum C
    Réponses: 6
    Dernier message: 09/12/2012, 00h53
  2. Double pointeur et allocation
    Par micromich dans le forum Débuter
    Réponses: 5
    Dernier message: 28/08/2008, 16h28
  3. Réponses: 6
    Dernier message: 07/07/2007, 18h12
  4. Réponses: 6
    Dernier message: 04/01/2007, 01h30
  5. double pointeur?
    Par ostralo dans le forum C++
    Réponses: 17
    Dernier message: 23/02/2006, 18h24

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