2014-07-07 9 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 (), и я не хочу получать ссылки на эти функции или документацию, я хочу изменить кого-то этот код, чтобы освободить память.

Thank!

+0

Какую память вы намерены освободить? В этом коде нет ничего особенного, что вам нужно будет освободить. – nos

+0

Как вы заключаете, что память ** не выпущена **? Какую проблему вы решаете, точно? – user4815162342

+0

Я хочу освободить память, занятую окном, фиксированной и кнопочной переменной. Я пришел к выводу, что память не освобождается, когда я запускаю код с valgrind. –

ответ

2

У вас есть alredy подключен gtk_main_quit к окну. Когда окно уничтожается, все дочерние виджеты также уничтожаются.

+0

В моем примере, когда окно уничтожено, память, на которой работает ее окно, выпущена вместе с памятью, занятой фиксированной и кнопочной переменной? –

+0

Я знаю, что если виджет будет уничтожен, это не означает, что освобождается память виджета. –

+0

Первая строка в вашей основной функции - это объявление трех указателей на тип GtkWidget. После этого вы используете 'window = gtk_window_new'. Я уверен, что эта функция возвращает адрес памяти, где выделен GtkWidget. Если вы alredy знаете, как манипулировать указателями, это примерно так: '* window = & your_widget'. Функция 'gtk_widget_destroy' должна быть как функция' free (* pointer) 'в C, так как это выбор для выпускной памяти. Обратите внимание, что функция 'free (* pointer)' и 'gtk_widget_destroy (* pointer)' fucntion имеют одинаковый синтаксис. – FilipeFalcao

Смежные вопросы