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

Linux Discussion :

[GLib] memory check g_object_new


Sujet :

Linux

  1. #1
    Membre régulier Avatar de Persistant
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Septembre 2016
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Septembre 2016
    Messages : 50
    Points : 73
    Points
    73
    Par défaut [GLib] memory check g_object_new
    Bonsoir,

    1] Dans un fichier test, j'ai crée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <glib-object.h>
    #include "dvz-object.h"
     
    int
    main(int argc, char *argv[])
    {
        DvzObject *object = dvz_object_new();
        DvzObject *obj = g_new(DvzObject, 1);
        g_object_unref(object);
        g_free(obj);
     
        return 0;
    }
    Quand je lance Valgrind le programme s'éxecute normalement et aucune fuite de mémoire n'est détécté.


    2] si je comment la liberation de la mémoire, Valgrind ne détecte une fuite de mémoire que pour obj = g_new(DvzObject, 1);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <glib-object.h>
    #include "dvz-object.h"
     
    int
    main(int argc, char *argv[])
    {
        DvzObject *object = dvz_object_new();
        DvzObject *obj = g_new(DvzObject, 1);
        //g_object_unref(object);
        //g_free(obj);
     
        return 0;
    }
    Savez-vous comment détécter que g_object_unref(object); n'as pas été appelé (et donc qu'il y a une fuite de mémoire) ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    64 bytes in 1 blocks are definitely lost in loss record 140 of 252
      dans main in /home/persistant/local/src/dvz/main.c:8
      1: malloc in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so
      2: g_malloc in /lib/x86_64-linux-gnu/libglib-2.0.so.0.4800.1
      3: main in /home/persistant/local/src/dvz/main.c:8

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

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

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Bonjour.

    Je pense que tu viens de mettre le doigt sur le problème du C : la libération mémoire non automatique.

    Ta problématique n'est pas typique de la GLib. Si tu cherches une fonction pour vérifier si l'objet est libéré autant lancer directement g_object_unref();. Pour ne pas rencontrer de crash sur un pointeur qui ne serait plus valide la bonne pratique veut qu'après avoir libéré un pointeur on place ca valeur à NULL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    g_object_unref(object);
    object = NULL;
     
     g_free(obj);
    obj = NULL;
    Ainsi, si plus loin dans le code tu effectues de nouveau un g_object_unref(); ou un g_free(); ces fonctions ne poseront aucun problème.

  3. #3
    Membre régulier Avatar de Persistant
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Septembre 2016
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Septembre 2016
    Messages : 50
    Points : 73
    Points
    73
    Par défaut
    Bonjour,

    Merci pour ta réponse. Effectivement j'oublie souvent d'effacer le pointer après libération.

    J'ai tout de même finie par trouver la réponse a ma question.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ G_SLICE=always-malloc G_DEBUG=gc-friendly valgrind --leak-check=full --log-file=vgdump.log ./tests
    La fonction g_clear_object n'est malheureusement pas la solution a mon problème. En faite, certains de mes GObject sont des Shared pointer, et je n'ai pas fait les ref et unref adéquat... je suis donc a leur recherche ...

    Je te souhaite d'excelente fête de fin d'année

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

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

    Informations forums :
    Inscription : Février 2008
    Messages : 2 291
    Points : 4 941
    Points
    4 941
    Billets dans le blog
    5
    Par défaut
    Bonnes fêtes de fin d'année à toi aussi

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 12/05/2014, 16h08
  2. Réponses: 2
    Dernier message: 13/02/2007, 12h28
  3. checking de connexion
    Par JEG dans le forum Développement
    Réponses: 4
    Dernier message: 09/10/2002, 13h36
  4. [propriétés]Option Checked
    Par psl dans le forum Composants VCL
    Réponses: 6
    Dernier message: 22/08/2002, 08h07
  5. Check Url pour savoir si erreur 404 ou si le site existe
    Par Clément[Delphi] dans le forum Composants VCL
    Réponses: 2
    Dernier message: 07/08/2002, 13h49

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