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 :

Fuite de mémoire dans "gtk_widget_show" ?


Sujet :

GTK+ avec C & C++

  1. #1
    Membre éclairé Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Par défaut Fuite de mémoire dans "gtk_widget_show" ?
    Salut !

    Je suis en train de me créer une petit bibliothèque graphique baser sur GTK+ pour pouvoir créer rapidement des petites GUI.

    Pour tester si je n'ai laissé passé aucune fuite mémoire, j'alloue puis déalloue indéfiniment mes objets.

    Pour ma partie qui créer des fenêtres, il semblerais que j'ai une fuite de mémoire. J'ai analyser mon code, est apparemment ca viendrais du "gtk_widget_show" de la lib GTK+

    Voici un bout de code qui fait monter la RAM a n'en plus finir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    int main (int argc, char *argv[])
    {
            gtk_init(&argc, &argv);
     
            for(;;)
            {
                    GtkWidget *widget = gtk_window_new(GTK_WINDOW_TOPLEVEL);
                    gtk_widget_show(widget);   // si j'enleve cette fonction, j'ai plus de fuite mémoire...
                    gtk_widget_destroy(widget);
                    usleep(1000); // on respire un peu
            }
    }
    Es que c'est moi qui fait mal quelque chose (il faut bien juste utiliser gtk_widget_destroy pour supprimer un widget ?) ? ou bien il y a effectivement une fuite de mémoire dans la fonction "gtk_widget_show" ?

    Merci pour votre aide.

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Il faut peut être que la mainloop gtk+ tourne pour que toute la mémoire puisse être correctement nettoyée, essaie de faire ton test avec un g_timeout_add dont le callback ferait a chaque fois une création et une destruction de fenetre

  3. #3
    Membre éclairé Avatar de Ekinoks
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2003
    Messages
    687
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2003
    Messages : 687
    Par défaut
    Merci pour ta réponse teuf13 =)

    Effectivement, il faut que la boucle d'évènement prenne la main entre chaque création et destruction ^^

    encore merci

  4. #4
    Nouveau candidat au Club
    Inscrit en
    Janvier 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 3
    Par défaut
    Salut,

    Il se trouve que j'ai aussi un problème de fuite de mémoire lié à Gtk, j'ai essayé de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    #include <stdio.h>
     
    #include <gtk/gtk.h>
     
    GtkWidget *widget ; 
    GtkWidget *widgetold ;
     
    gboolean maj_thread (gpointer data)
    {
    	widgetold = widget;
    	gtk_widget_destroy(widgetold);
    	widget = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    	gtk_widget_show(widget);   // si j'enleve cette fonction, j'ai plus de fuite mémoire...
    	return TRUE;
    }
     
    int main (int argc, char *argv[])
    {
            gtk_init(&argc, &argv);
     
    	g_timeout_add(500, (GSourceFunc) maj_thread, NULL);
    	gtk_main ();
     
     
    }
    mais j'ai toujours une légère fuite de mémoire en faisant : #cat /proc/meminfo

    ~/Bureau$ cat /proc/meminfo
    MemTotal: 1026316 kB
    MemFree: 214216 kB
    Buffers: 104108 kB
    Cached: 310672 kB
    SwapCached: 0 kB
    Active: 423628 kB
    Inactive: 253056 kB
    HighTotal: 121344 kB
    HighFree: 30716 kB
    LowTotal: 904972 kB
    LowFree: 183500 kB
    SwapTotal: 979924 kB
    SwapFree: 979924 kB
    Dirty: 100 kB
    Writeback: 0 kB
    AnonPages: 261932 kB
    Mapped: 83328 kB
    Slab: 38332 kB
    SReclaimable: 26504 kB
    SUnreclaim: 11828 kB
    PageTables: 3112 kB
    NFS_Unstable: 0 kB
    Bounce: 0 kB
    CommitLimit: 1493080 kB
    Committed_AS: 950436 kB
    VmallocTotal: 114680 kB
    VmallocUsed: 6560 kB
    VmallocChunk: 107508 kB
    ~/Bureau$ cat /proc/meminfo
    MemTotal: 1026316 kB
    MemFree: 214104 kB
    Buffers: 104116 kB
    Cached: 310672 kB
    SwapCached: 0 kB
    Active: 423740 kB
    Inactive: 253064 kB
    HighTotal: 121344 kB
    HighFree: 30604 kB
    LowTotal: 904972 kB
    LowFree: 183500 kB
    SwapTotal: 979924 kB
    SwapFree: 979924 kB
    Dirty: 84 kB
    Writeback: 0 kB
    AnonPages: 262044 kB
    Mapped: 83328 kB
    Slab: 38332 kB
    SReclaimable: 26504 kB
    SUnreclaim: 11828 kB
    PageTables: 3112 kB
    NFS_Unstable: 0 kB
    Bounce: 0 kB
    CommitLimit: 1493080 kB
    Committed_AS: 950540 kB
    VmallocTotal: 114680 kB
    VmallocUsed: 6560 kB
    VmallocChunk: 107508 kB
    Ai-je oublié qqch??

    Merci

  5. #5
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Ca me paraît pas bien concluant tes chiffres... Tu regardes la conso mémoire globale, il doit y avoir bien des programmes susceptibles de consommer de la mémoire. valgrind me paraît bien plsu adapté pour regarder s'il y a une fuite mémoire ou non (avec G_SLICE="always-malloc" de défini dans ton environnement)

  6. #6
    Nouveau candidat au Club
    Inscrit en
    Janvier 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 3
    Par défaut
    J'ai fait le test avec valgrind et la variable d'environnement G_SLICE à "always-malloc", je n'ai effectivement pas de perte mémoire pendant l'application.

    Merci

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

Discussions similaires

  1. Fuite de mémoire dans ce code ?
    Par ipingu dans le forum C++
    Réponses: 2
    Dernier message: 07/09/2007, 11h54
  2. Réponses: 8
    Dernier message: 09/02/2007, 15h31

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