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 :

Libération de mémoire


Sujet :

C

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 5
    Points : 7
    Points
    7
    Par défaut Libération de mémoire
    Bonjour!

    Je dois faire un programme pour manipuler des automates.
    Dans mon main(), je déclare un automate ainsi:
    Automate* auto = malloc(blabla..);

    Si je voulais libérer l'espace mémoire alloué pour cet automate dans mon programme principal, si j'ai bien tout compris, j'écrirais:
    free(auto);

    Mais là, il m'est demandé de créer une procédure de suppression d'un automate qui prend la référence à cet automate en paramètre, et donc, en clair, une procédure dont la signature est:
    void suppression_automate (Automate** automate);
    (et à un moment donné du corps de la fonction, après avoir libéré les différents composants de l'automate, je dois écrire: free(automate); )

    Je ne comprends pas pourquoi je passe un pointeur du pointeur.
    Je suis d'accord que dans une procédure où je devrais allouer la mémoire, comme par exemple:
    void initialiser_automate(Automate** automate);
    J'aurais: *automate= malloc(blabla);
    parce que pour affecter de la mémoire au pointeur, et ne pas perdre cette information une fois la procédure terminée, il faut le passer par adresse.
    Mais c'est le même principe pour free()?

    Peut-être que c'est juste que je ne comprends pas exactement comment fonctionne free(), finalement...

    Bref, merci de m'avoir lue, et merci d'avance pour vos éclaircissements!

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 368
    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 368
    Points : 23 622
    Points
    23 622
    Par défaut
    Bonjour,

    Je pense que tu as pratiquement résolu ton problème tout seul : à mon avis, si ce prototype t'est imposé, ce doit être pour permettre à la routine de libération de remettre elle-même le pointeur à NULL une fois la mémoire rendue au système.

    Bon courage.

  3. #3
    Membre habitué Avatar de Abacar94
    Homme Profil pro
    L2 Math-informatique
    Inscrit en
    Novembre 2015
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Niger

    Informations professionnelles :
    Activité : L2 Math-informatique

    Informations forums :
    Inscription : Novembre 2015
    Messages : 103
    Points : 133
    Points
    133
    Par défaut
    Citation Envoyé par Yoruichi7 Voir le message

    Peut-être que c'est juste que je ne comprends pas exactement comment fonctionne free(), finalement...

    Bref, merci de m'avoir lue, et merci d'avance pour vos éclaircissements!
    Quant tu exécute un programme il prend automatiquement l'espace requit pour les
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     int float char ........
    mais pour les pointeur c'est un peut différent car on ne sait pas à priori quel espace réserver c'est pour pâlir à sa que sers pour allouer une mémoire mais même si on supprime les contenus des pointeurs ils ne rendent pas la mémoire au système d'où le rôle de donc en conclusion pour un pointeur on vide le contenu et on libère l'espace mémoire avec

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 684
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 684
    Points : 30 973
    Points
    30 973
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Yoruichi7 Voir le message
    Je ne comprends pas pourquoi je passe un pointeur du pointeur.
    Je suis d'accord que dans une procédure où je devrais allouer la mémoire, comme par exemple:
    void initialiser_automate(Automate** automate);
    J'aurais: *automate= malloc(blabla);
    parce que pour affecter de la mémoire au pointeur, et ne pas perdre cette information une fois la procédure terminée, il faut le passer par adresse.
    Exact
    Citation Envoyé par Yoruichi7 Voir le message
    Mais c'est le même principe pour free()?
    Peut-être que c'est juste que je ne comprends pas exactement comment fonctionne free(), finalement...
    Non non, tu as très bien compris le free(). Son rôle est de récupérer la valeur du pointeur pour libérer l'espace qui y est associé mais n'a absolument pas besoin de modifier la valeur dudit pointeur donc n'a pas besoin de son adresse.
    Ainsi dans une procédure standard, tu appelles free(ptr) donc la fonction reçoit une copie de ce "ptr". Partant de là, comme pour toute fonction recevant une copie de l'élément passé, le "ptr" d'origine ne peut absolument pas être modifé par la fonction (ce qui ne l'empêche pas d'utiliser sa valeur pour faire son travail de libération).
    Donc si avant d'appeler free() le pointeur vaut "0x10", après le free il continue à valoir "0x10" mais cette adresse ne signifie maintenant plus rien.

    Toutefois, certains codeurs aiment bien écrire ceci
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char *ptr=malloc(blabla);
    ...(travail avec ptr)...
    free(ptr), ptr=NULL;
    C'est dû au fait qu'il t'est interdit d'utiliser ptr tant qu'il contient une valeur sans signification. Ainsi ce code...
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char *ptr=malloc(blabla);
    ...(travail avec ptr)...
    free(ptr);
    printf("mon pointeur ptr vaut %p\n", ptr);
    ...est interdit. Un intervenant (qui a maintenant disparu mais qui faisait autrefois référence sur ce forum) m'a même dit que ça produisait un comportement indéterminé. C'est pour éviter ce danger que les codeurs rajoutent l'affectation à NULL afin que la valeur du pointeur soit toujours une valeur valide (parce que "NULL" est une valeur valide). Donc ainsi que l'a dit Obsidian, si ta fonction reçoit l'adresse du pointeur, elle pourra et le libérer, et lui affecter automatiquement cette valeur NULL.

    Citation Envoyé par Yoruichi7 Voir le message
    (et à un moment donné du corps de la fonction, après avoir libéré les différents composants de l'automate, je dois écrire: free(automate); )
    Non, tu écriras free(*automate)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Libération de mémoire non réservée (operator=)
    Par 84mickael dans le forum C++
    Réponses: 7
    Dernier message: 27/05/2006, 13h30
  2. Problème libération de mémoire?
    Par Bartuk dans le forum C
    Réponses: 7
    Dernier message: 28/12/2005, 17h20
  3. Libération de mémoire
    Par petitcoucou31 dans le forum Langage
    Réponses: 1
    Dernier message: 16/09/2005, 14h10
  4. [Debutant(e)]problème de libération de mémoire
    Par skywalker3 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 10/02/2005, 17h38
  5. Réponses: 25
    Dernier message: 16/07/2003, 20h41

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