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

GTK+ avec C & C++ Discussion :

Désallouer de la mémoire.


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    Par défaut Désallouer de la mémoire.
    Bonjour

    Je suis tombé sur ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_markup_dom_free (node->child+i), node->child = NULL;
    Comme je ne maîtrise pas la virgule, je demande une aide pour tout comprendre :
    1) La seconde partie s'exécute bien si la réponse à la première est juste. N'est-ce pas ?
    2) Pourquoi affecté NULL à ce pointeur si lui-même après disparaîtra ? En fait, c'est un élément d'une arborescence qu'on détruit. Je dois bien affecter à NULL mon dernier pointeur si sa valeur risque servir à nouveau. Je n'en vois pas l'intérêt si juste après je sort de ma fonction et que c'est une valeur locale.
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 308
    Billets dans le blog
    5
    Par défaut
    Je répondrai oui. Plusieurs cas sont possibles pour ne pas remettre la variable à NULL:
    • La variable n'est pas réutilisée.
    • La variable est locale et n'est pas réutilisée.
    • La variable est tout de suite réinitialisée avec un nouveau pointeur valide.

    Maintenant une autre démarche est possible. Mettre systématiquement à NULL une variable contenant un pointeur devenu invalide quelque soit son état (local ou global). Ca évite tout problème. Ceci n'est qu'une habitude de travail.

  3. #3
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    Citation Envoyé par troumad Voir le message
    Bonjour

    Je suis tombé sur ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_markup_dom_free (node->child+i), node->child = NULL;
    Comme je ne maîtrise pas la virgule, je demande une aide pour tout comprendre :
    1) La seconde partie s'exécute bien si la réponse à la première est juste. N'est-ce pas ?
    La virgule permet de faire plusieurs opérations en une ligne. Cela peut être utile pour faire par exemple plusieurs initialisations dans une boucle for, ou pour effectuer des opérations de manière parallèle dans le cadre de micro optimisations (par exemple le processeur est capable d'effectuer une addition et une multiplication en même temps, car cela utilise des composants matériels différents).

    Ce qui suit la virgule est exécuté dans tous les cas, pas uniquement si ce qu'il y a avant est vrai.

    Citation Envoyé par troumad Voir le message
    2) Pourquoi affecté NULL à ce pointeur si lui-même après disparaîtra ? En fait, c'est un élément d'une arborescence qu'on détruit. Je dois bien affecter à NULL mon dernier pointeur si sa valeur risque servir à nouveau. Je n'en vois pas l'intérêt si juste après je sort de ma fonction et que c'est une valeur locale.
    Déjà, je remarque que g_markup_dom_free ne fait pas partie de la glib. Ensuite, pris hors de son contexte, c'est assez difficile de te répondre. Je ne vois l'intérêt de mettre quelque chose à null que si on vient de le libérer, or ce n'est pas le cas (node->child != (node->child+i)). Il faut que tu nous indiques où tu as trouvé ce code pour que l'on puisse comprendre pourquoi le développeur a fait cela.

  4. #4
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  5. #5
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    Je ne vois nulle part la ligne que tu as cité. Les lignes contenant appelant g_markup_dom_free sont:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    gmarkup-dom.c:225:    g_markup_dom_free (node->child), node->child = NULL;
    gmarkup-dom.c:226:    g_markup_dom_free (node->next), node->next = NULL;
    main.c:81:    g_markup_dom_free (node), node = NULL;
    Je ne vois pas de "+i". Il s'agit donc juste de mettre à NULL une variable libérée, afin de détecter plus facilement si on tente de la réutiliser une fois détruite.

  6. #6
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    Par défaut
    Le "+i" n'existe alors que dans ma version modifiée ! Mais la question est la même dans les lignes que tu as relevées. En fait, ce sont elles qui m'ont montrée l'exemple. Je me pose la question de l'utilité du "= NULL" dans ces exemples.
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  7. #7
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Par défaut
    Je répète:

    Citation Envoyé par liberforce Voir le message
    Il s'agit donc juste de mettre à NULL une variable libérée, afin de détecter plus facilement si on tente de la réutiliser une fois détruite.
    En l'occurrence, celui du main ne sert à rien, mais ceux dans gmarkup-dom.c sont là pour éviter que l'utilisateur de cette API ne commette des erreurs de programmations du style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    g_markup_dom_free (node);
    [...]
    g_markup_dom_free (node);
    Si node n'a pas été remis à NULL, un deuxième appel va occasionner une erreur de segmentation à cause d'une tentative de libérer 2 foix la même zone mémoire. Là il n'y aura aucune erreur et le programmeur n'aura pas de crash. Mais il ne sera pas non plus prévenu que son programme est mal écrit.

    Si le développeur du programme d'origine fait ça, c'est plus par systématisme pour éviter ce type d'erreur. Un peu comme les gens qui initialisent toujours les variables à une valeur connnue, quitte à l'écraser 3 lignes plus loin. C'est son style de programmation à lui.

  8. #8
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 607
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 607
    Par défaut
    Merci !
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

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

Discussions similaires

  1. Fuite mémoire, comment bien désallouer ?
    Par k3ops dans le forum OpenCV
    Réponses: 10
    Dernier message: 03/07/2008, 16h47
  2. [2.0] Comment désallouer de la mémoire
    Par franculo_caoulene dans le forum Windows Forms
    Réponses: 8
    Dernier message: 18/03/2008, 14h14
  3. fichier mappé en mémoire
    Par WinBernardo dans le forum Delphi
    Réponses: 7
    Dernier message: 01/12/2006, 09h38
  4. Réponses: 13
    Dernier message: 24/03/2005, 13h33
  5. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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