2014-07-07 119 views
0

我有這樣的代碼:如何釋放內存?

#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; 
} 

我試圖釋放內存,但失敗。也許有人修改這個代碼,以便釋放內存? 我讀到的GTK內存管理和我在它在很大程度上是如何工作的理解,但無法釋放內存...

我瞭解這些功能如何工作gtk_widget_destroy(),g_object_ref_seek(),g_object_ref()和g_object_unref( ),並且我不想在這些函數或文檔中接收引用,我希望修改某個代碼,以便釋放內存。

謝謝!

+0

你打算釋放哪些內存?這段代碼中沒有什麼特別的,你需要發佈。 – nos

+0

你如何斷定內存是不是**被釋放?你究竟解決了什麼問題? – user4815162342

+0

我想釋放佔用窗口,固定和按鈕變量的內存。我的結論是,當我使用valgrind運行代碼時,內存不會被釋放。 –

回答

2

您已將alknow連接到窗口gtk_main_quit。當窗口被銷燬時,她的所有子窗口小部件也被銷燬。

+0

在我的例子中,當窗口被銷燬時,窗口處理她的內存被釋放,同時佔用的固定內存和按鈕變量? –

+0

我知道,如果一個小部件被銷燬,這並不意味着該小部件的內存被釋放。 –

+0

你主函數的第一行是指向GtkWidget類型的三個指針的聲明。之後你使用'window = gtk_window_new'。我很確定這個函數返回GtkWidget被分配的內存地址。如果你知道如何操作指針,那就是這樣的:'* window =&your_widget'。函數'gtk_widget_destroy'應該像C中的'free(* pointer)'函數,因爲這是釋放內存的選擇。注意'free(* pointer)'函數和'gtk_widget_destroy(* pointer)'函數具有相同的語法。 – FilipeFalcao