我需要在GTK中释放弹出式菜单吗?

4

这是我第一次使用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是否自动处理清洁工作?
1个回答

4

GtkMenuGtkWidget的子类,而GtkWidget则是GInitiallyUnowned的子类,因此它具有浮动引用(floating-ref)的特性。

当您弹出菜单时,它的工作方式类似于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 的实现细节,永远不应直接访问。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接