2014-02-12 62 views
4

這是我第一次使用GTK。我有下面的代碼,我想知道它是否在泄漏內存。它在每次發生右鍵單擊時都會調用的函數中。我需要在GTK中釋放彈出式菜單嗎?

GtkWidget *menu = gtk_menu_new(); 

//while loop adding a bunch of menu items 
gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); 

gtk_widget_show_all(menu); 
gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 3, event->button.time); 

GTK自動處理清潔?

回答

3

GtkMenu,如您的代碼所示,是GtkWidget的一個子類,它又是GInitiallyUnowned的子類。所以它擁有所有浮動魔法。

當你彈出一個菜單時,它就像GtkWindow一樣工作,所以它會自動重新引用浮動引用,並且最終,當菜單被解除時,它將被未引用和釋放。

簡答:是的,它是自動的,所以你的代碼是正確的。

您可以檢查我就用這個代碼:

g_object_ref_sink(menu); //ref = 1 
g_menu_popup(...); 
g_print("I am %s\n", menu->ref_count==1? "right" : "wrong"); 
g_object_unref(menu); 

注:請不要使用ref_count任何東西,但調試!它應該被視爲GObject的實現細節,永遠不會被直接訪問。