g_object_new应该匹配g_object_unref吗?

时间:2010-05-17 10:30:01

标签: c memory glib gobject

我正在使用 libnotify 在我的application中显示桌面通知; notify_notification_new()返回NotifyNotification*,应该作为第一个参数传递给通知库的其他函数调用。

没有notify_notification_free()可以释放它返回的指针。我查找了notify_notification_new()的来源,并在内部执行了g_object_new(),获得了 GObject * 并将其作为NotfiyNotification*返回,因此当我的应用程序执行清理,我应该在g_object_unref()返回的指针上调用notify_notification_new()吗?

2 个答案:

答案 0 :(得分:10)

是的,除非引用是“浮动”。 GInitiallyUnowned的子类使用浮动引用;最常见的用途是GTK小部件。

使用gtk_whatever_new()函数创建GTK小部件时,它有一个标记为浮动的引用。将小部件添加到容器时,容器还必须包含对小部件的引用。但是,不是在窗口小部件上调用g_object_ref()并将引用计数增加到2,而是“沉没”对象的浮动引用并将其转换为普通引用。你可以说容器现在“拥有”小部件。

然后,当您销毁容器时,它会在窗口小部件上调用g_object_unref(),并且引用计数变为零,并且窗口小部件将被销毁。这样你就不再负责自己摧毁它了。

因此,对于通常不会进入容器的普通GObject s,不会转让所有权。当你完成它们时,你必须自己取消它们。

答案 1 :(得分:3)

答案是肯定的,我从Gnome's page on ownership想出来了,我希望以后可以帮助别人。