2014-02-12 88 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的实现细节,永远不会被直接访问。