我正在使用 libnotify 在我的application中显示桌面通知; notify_notification_new()
返回NotifyNotification*
,应该作为第一个参数传递给通知库的其他函数调用。
没有notify_notification_free()
可以释放它返回的指针。我查找了notify_notification_new()
的来源,并在内部执行了g_object_new()
,获得了 GObject * 并将其作为NotfiyNotification*
返回,因此当我的应用程序执行清理,我应该在g_object_unref()
返回的指针上调用notify_notification_new()
吗?
答案 0 :(得分:10)
是的,除非引用是“浮动”。 GInitiallyUnowned
的子类使用浮动引用;最常见的用途是GTK小部件。
使用gtk_whatever_new()
函数创建GTK小部件时,它有一个标记为浮动的引用。将小部件添加到容器时,容器还必须包含对小部件的引用。但是,不是在窗口小部件上调用g_object_ref()
并将引用计数增加到2,而是“沉没”对象的浮动引用并将其转换为普通引用。你可以说容器现在“拥有”小部件。
然后,当您销毁容器时,它会在窗口小部件上调用g_object_unref()
,并且引用计数变为零,并且窗口小部件将被销毁。这样你就不再负责自己摧毁它了。
因此,对于通常不会进入容器的普通GObject
s,不会转让所有权。当你完成它们时,你必须自己取消它们。
答案 1 :(得分:3)
答案是肯定的,我从Gnome's page on ownership想出来了,我希望以后可以帮助别人。