我正在编写一些 C 代码,其中有一个用于构建 GTK 4 小部件的复杂算法,并且由于输入数据的某些组合,其中一些小部件可能最终“无效”。然而,我不能总是事先知道我是如何设计我的应用程序的(并且事先进行“验证”步骤可能比无效小部件的一些额外分配成本更高),所以有时我最终会分配一个容器小部件然后未使用,因为没有可以添加的子项。在这些情况下,如果我确定该小部件无效,我想在函数结束时释放该小部件。我尝试寻找解决方案,并发现了问题 GTK 2 中的免费对象/小部件?,但它适用于 GTK 2,一个答案提到使用
gtk_widget_destroy ()
,它似乎已在 GTK 3 和 GTK 4 之间删除.
那么,如何在 C 中释放 GTK 4 小部件?
要在 GTK 中手动释放小部件,您需要使用
g_object_ref_sink ()
获取它的所有权,因为 GtkWidget 实例以“浮动”引用开始。之后,您可以决定是否将其设为父级,然后使用 g_object_unref ()
来降低引用计数并可能释放它。像这样的东西:
// Create the widget.
GtkWidget *widget = some_widget_new ();
// Take ownership, "sink" the floating reference.
g_object_ref_sink (widget);
// Check if widget setup was successful
if (setup_widget (widget))
// If it was, parent the widget.
add_child (parent, widget);
// Decrease the refcount
g_object_unref (widget);