7

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

没有notify_notification_free()释放它返回的指针。我查找了源代码notify_notification_new()并在内部执行了 a g_object_new(),获取了GObject*并将其作为 a 返回NotfiyNotification*,所以当我的应用程序进行清理时,我应该g_object_unref()在返回的指针上调用 anotify_notification_new()吗?

4

2 回答 2

13

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

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

然后当你销毁容器时,它会调用g_object_unref()widget,并且引用计数变为零,并且widget被销毁。这样你就不用再为自己毁掉它负责了。

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

于 2010-05-17T13:29:16.267 回答
3

答案是肯定的,我是从Gnome 的所有权页面中找到的,希望对以后的人有所帮助。

于 2010-05-17T10:47:19.020 回答