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 :

GdkPixbuf et Mémoire


Sujet :

GTK+ avec C & C++

  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2007
    Messages
    95
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Janvier 2007
    Messages : 95
    Par défaut GdkPixbuf et Mémoire
    Bonsoir,

    Faut-il faire quelque chose pour libérer l'espace mémoire utilisé par un GdkPixbuf ?

    Exemple avec cette fonction essai :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void essai (void)
    {
    GdkPixbuf *pixbuf;
    gint i;
     
    i = 20;
    pixbuf = gdk_pixbuf_new_from_file.....
     
    ...
     
    ...
    }
    1- Après l'appel de cette fonction, l'espace mémoire utilisé par pixbuf est-il libéré (comme la variable i par exemple) ? Sinon comment faut-il faire ?

    2- Quand on utilise des GtkWidget (enfants à fenêtre), j'ai l'impression que leur espace mémoire est libéré lorque l'on fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gtk_widget_destroy(GTK_WIDGET(fenetre));
    me trompe-je ?

    3- Et pour les GdkPixmap ?

    Merci.

  2. #2
    Membre chevronné Avatar de Lunixinclar
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2006
    Messages
    416
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 416
    Par défaut
    Salut,

    1) i est une variable locale elle est détruite quand la fonction se termine. SAUF si elle est déclarée avec le modifier "static", ce qui n'est pas le cas ici.

    L'espace du pixbuf n'est pas libéré. Il faut invoquer gdk_pixbuf_unref() c'est expliqué là dans le premier chapitre http://developer.gnome.org/doc/API/g...fcounting.html
    Citation Envoyé par doc
    GdkPixbuf structures are reference counted. This means that an application can share a single pixbuf among many parts of the code. When a piece of the program needs to keep a pointer to a pixbuf, it should add a reference to it. When it no longer needs the pixbuf, it should subtract a reference. The pixbuf will be destroyed when its reference count drops to zero. Newly-created GdkPixbuf structures start with a reference count of one.
    En clair quand on crée un pixbuf ça incrémente le nombre de références. Quand le nombre de références est décrémenté et atteint zéro, l'espace est libéré.

    2) non. Tu peux confirmer? http://developer.gnome.org/doc/API/2...GtkWidget.html

    3) Ou est donc la documentation?

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2007
    Messages
    95
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Janvier 2007
    Messages : 95
    Par défaut
    Citation Envoyé par Lunixinclar
    En clair quand on crée un pixbuf ça incrémente le nombre de références. Quand le nombre de références est décrémenté et atteint zéro, l'espace est libéré.
    Merci de ta réponse. J'ai déjà vu la doc mais je ne comprends pas trop. Que veux-tu dire par "incrémenter le nombre de références" ? J'ai déjà du mal à comprendre ce qu'est une référence !!!

    Par rapport à mon exemple ci-dessus, pour libérer l'espace mémoire, il faut que je mette en fin de fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g_object_unref(pixbuf);
    Je précise qu'il est conseillé d'utiliser g_obect.. plutôt que g_pixbuf.


    Merci !

  4. #4
    Membre confirmé
    Inscrit en
    Janvier 2007
    Messages
    95
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Janvier 2007
    Messages : 95
    Par défaut
    Ca y est, je crois que j'ai compris :

    Quand on crée un pixbuf, son nombre de références est à un. (le pixbuf est crée lors de sa déclaration ou ailleurs ??)

    Dès qu'il y a dans un morceau de code :
    le nombre de références est incrémenter.
    Inversement, quand il y a :
    le nombre de références est décrémenté.
    Quand il est à 0, le pixbuf est détruit et son emplacement mémoire est libéré !!

    Pour reprendre ma fonction essai ci-dessus, l'emplacement mémoire de pixbuf n'est pas libéré cela veut dire que la mémoire ne peut plus être utilisée ?? et le pixbuf non plus ??

    Merci.

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2007
    Messages
    95
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Janvier 2007
    Messages : 95
    Par défaut
    Personne ne peut m'expliquer comment utiliser proprement les Gdkpixbuf, pour gérer correctement la mémoire ? J'ai des gros problèmes de mémoire !! Je ne comprends pas trop la doc en anglais !!


    Merci.

Discussions similaires

  1. fichier mappé en mémoire
    Par WinBernardo dans le forum Delphi
    Réponses: 7
    Dernier message: 01/12/2006, 09h38
  2. Accéder à un espace mémoire sous XP
    Par keny dans le forum x86 32-bits / 64-bits
    Réponses: 4
    Dernier message: 02/08/2002, 12h37
  3. Déterminer l'adresse d'une application en mémoire
    Par Gib dans le forum x86 32-bits / 64-bits
    Réponses: 9
    Dernier message: 11/06/2002, 14h27
  4. Vitesse de la mémoire vidéo
    Par Anonymous dans le forum x86 16-bits
    Réponses: 3
    Dernier message: 06/06/2002, 20h20
  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