2014-07-07 4 views
0

Je possède ce code:Comment libérer la mémoire?

#include <gtk/gtk.h> 

int main(int argc, char *argv[]) 
{ 
    GtkWidget *window, *fixed, *button; 

    gtk_init(&argc, &argv); 

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 
    gtk_window_set_resizable(GTK_WINDOW(window), FALSE); 
    gtk_widget_set_size_request(window, 400, 400); 
    gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER); 
    gtk_window_set_title(GTK_WINDOW(window), "Test"); 
    gtk_widget_show(window); 
    g_signal_connect(G_OBJECT(window), "destroy", 
        G_CALLBACK(gtk_main_quit), NULL); 

    fixed = gtk_fixed_new(); 
    gtk_container_add(GTK_CONTAINER(window), fixed); 
    gtk_widget_show(fixed); 

    button = gtk_button_new_with_label("click"); 
    gtk_fixed_put(GTK_FIXED(fixed), button, 30, 30); 
    gtk_widget_show(button); 

    gtk_main(); 

    return 0; 
} 

Je suis en train de libérer la mémoire, mais échouent. Peut-être quelqu'un pour modifier ce code de sorte que la mémoire à libérer? J'ai lu sur la gestion de la mémoire dans GTK et je comprends en grande partie comment cela fonctionne, mais ne parviennent pas à libérer la mémoire ...

Je comprends comment ces fonctions fonctionne gtk_widget_destroy(), g_object_ref_seek(), g_object_ref() et g_object_unref () et je ne veux pas recevoir les références à ces fonctions ou à la documentation, je souhaite modifier quelqu'un de ce code pour que la mémoire soit libérée.

Merci!

+0

De quelle mémoire avez-vous l'intention de libérer? Il n'y a rien de particulier dans ce code que vous devriez publier. – nos

+0

Comment pouvez-vous conclure que la mémoire n'est pas ** ** libérée? Quel problème résolvez-vous exactement? – user4815162342

+0

Je veux libérer la mémoire occupée de la fenêtre, fixe et variable de bouton. J'ai conclu que la mémoire n'est pas libérée quand je cours le code avec valgrind. –

Répondre

2

Vous avez déjà connecté gtk_main_quit à la fenêtre. Lorsque la fenêtre est détruite, tous ses widgets enfants sont également détruits.

+0

Dans mon exemple lorsque la fenêtre est détruite, la mémoire sur laquelle la fenêtre la traite est libérée avec la mémoire occupée de la variable fixe et du bouton? –

+0

Je sais que si un widget est détruit cela ne signifie pas que la mémoire du widget est libérée. –

+0

La première ligne de votre fonction principale est la déclaration de trois pointeurs au type GtkWidget. Après cela, vous utilisez 'window = gtk_window_new'. Je suis assez sûr que cette fonction renvoie l'adresse de mémoire où le GtkWidget est alloué. Si vous savez déjà comment manipuler les pointeurs, c'est quelque chose comme ça: '* window = & your_widget'. La fonction 'gtk_widget_destroy' devrait être comme la fonction' free (* pointer) 'dans C car c'est le choix de la version release. Notez que la fonction 'free (* pointer)' et la fonction 'gtk_widget_destroy (* pointer)' ont la même syntaxe. – FilipeFalcao

Questions connexes