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 :

Libération mémoire + variable inutile en fin de code


Sujet :

GTK+ avec C & C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    111
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 111
    Par défaut Libération mémoire + variable inutile en fin de code
    Bonjour à tous !!
    Je souhaite avoir le code le plus propre possible et surtout avoir des temps de réponses rapide pour mon application.

    JE cherche donc a éviter toutes pertes de mémoires inutiles
    Voici un bout de code :
    Code C : 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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    // On récupère le fichier Xml contenant les différents menus possible pour le bandeau de gauche
    		gxml = glade_xml_new ("../ihm_final.glade","Menu_2", NULL);
     
    		// On récupère des objets précis du fichiers xml
    		GtkWidget * vbox = glade_xml_get_widget (gxml, "Menu_2");
    		GtkWidget * btn_TGC = glade_xml_get_widget (gxml, "Menu2_btn_TGC");
    		GtkWidget * btn_GC = glade_xml_get_widget (gxml, "Menu2_btn_GC");
    		GtkWidget * btn_PC = glade_xml_get_widget (gxml, "Menu2_btn_PC");
    		GtkWidget * btn_Loupe = glade_xml_get_widget (gxml, "Menu2_btn_Loupe");
    		GtkWidget * btn_Zoom1 = glade_xml_get_widget (gxml, "Menu2_btn_Zoom1");
    		GtkWidget * btn_Zoom2 = glade_xml_get_widget (gxml, "Menu2_btn_Zoom2");
    		GtkWidget * btn_Regler = glade_xml_get_widget (gxml, "Menu2_btn_Regler");
    		GtkWidget * btn_Photo = glade_xml_get_widget (gxml, "Menu2_btn_Photo");
    		GtkWidget * btn_Video = glade_xml_get_widget (gxml, "Menu2_btn_Video");
    		GtkWidget * Menu2_progressbar = glade_xml_get_widget (gxml, "Menu2_progressbar");
     
    		// On garde un pointeur sur chaque objet du menu pour une gestion plus facile par la suite
    		liste = gtk_data_list_add_by_name(liste,btn_TGC,"btn_TGC");
    		liste = gtk_data_list_add_by_name(liste,btn_GC,"btn_GC");
    		liste = gtk_data_list_add_by_name(liste,btn_PC,"btn_PC");
    		liste = gtk_data_list_add_by_name(liste,btn_Loupe,"btn_Loupe");
    		liste = gtk_data_list_add_by_name(liste,btn_Zoom1,"btn_Zoom1");
    		liste = gtk_data_list_add_by_name(liste,btn_Zoom2,"btn_Zoom2");
    		liste = gtk_data_list_add_by_name(liste,btn_Regler,"btn_Regler");
    		liste = gtk_data_list_add_by_name(liste,btn_Photo,"btn_Photo");
    		liste = gtk_data_list_add_by_name(liste,btn_Video,"btn_Video");
    		liste = gtk_data_list_add_by_name(liste,Menu2_progressbar,"Menu2_progressbar");
     
    		// On vide le conteneur pour charger le menu adéquat
    		list = gtk_container_get_children(GTK_CONTAINER(button));
    		while(list)
    		{
    			// On détruit l'objet présent dans le conteneur et on passe au suivant
    			gtk_widget_destroy(GTK_WIDGET(list->data));
    			list = g_list_next(list);
    		}
    		// On libère la ressource
    		g_list_free(list);
     
    		// On affiche le nouveau menu
    		gtk_widget_show (vbox);
    		gtk_box_pack_start (GTK_BOX (GTK_WIDGET(button)), vbox, TRUE, TRUE, 0);
     
    		// En fonction du systeme dans lequel on se trouve, on cache ou pas certains boutons
    		if (systeme==1){
    			gtk_widget_hide(btn_TGC);
    			gtk_widget_hide(btn_GC);
    			gtk_widget_hide(btn_Zoom1);
    			gtk_widget_hide(btn_Zoom2);
    		}
     
    		// On connecte les signaux nécessaires
    		g_signal_connect_swapped ((gpointer) btn_Regler, "clicked",
    								G_CALLBACK (on_Fen_OPS_Menu2_btn_Regler_clicked),
    								GTK_OBJECT (fen_Operationnel));

    J'aimerais libéré de la mémoire les variables du style "btn_TGC"
    Qqn peut m'indiquer la meilleure méthode en gtk ??
    merci

  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
    Le plus simple avec un widget GTK+ est d'utiliser la fonction gtk_widget_destroy(); Il faut aussi avoir en tête que bon nombre de données "dérivent" des GObject. Un g_oject_unref(); dessus est donc aussi un bon moyen.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 4
    Par défaut
    Dans la majorité des cas, il n'est pas nécessaire de détruire un widget dans la mesure où quand un conteneur est détruit (généralement une fenêtre principale), les contenus sont détruits automatiquement. Pour une bonne réactivité de l'application, il est préférable de créer ses widgets à l'initialisation, de les agencer dans un conteneur puis de masquer (ou pas) ce qui sont inutiles (ou respectivement nécessaires), car la création et la destruction d'un widget est de toute façon relativement coûteuse (d'autant plus couteuse dans le cas d'environnement graphique réseau utilisé avec un display distant tel que X.org).

    Concernant le concept d'éviter le gaspillage de mémoire en libérant un widget ponctutellement devenu inutile, c'est assez utopique concernant les toolkits graphiques : la quasi-totalité d'entre-eux implémentent un allocateur mémoire qui met cache les morceaux alloués et libérés fréquemment pour des raisons de performance : ils ne sont donc pas rendus au système dès leur libération.

Discussions similaires

  1. Problème de libération mémoire
    Par chrono23 dans le forum C++
    Réponses: 16
    Dernier message: 07/09/2006, 23h18
  2. Réponses: 3
    Dernier message: 20/04/2006, 17h59
  3. Réponses: 3
    Dernier message: 14/03/2006, 05h19
  4. [COM] Libération mémoire
    Par MC2 dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 13/01/2006, 16h15
  5. FIREBIRD + APPLI EN C : Problèmes de libération mémoire
    Par lio33 dans le forum Connexion aux bases de données
    Réponses: 4
    Dernier message: 16/09/2005, 09h07

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