C 一个新的g_对象是否应该有一个匹配的g_对象?

C 一个新的g_对象是否应该有一个匹配的g_对象?,c,memory,glib,gobject,C,Memory,Glib,Gobject,我正在使用libnotify在我的浏览器中显示桌面通知;返回一个NotifyNotification*,它应该作为第一个参数传递给通知库的进一步函数调用 没有任何notify\u notification\u free()可以释放它返回的指针。我查找了notify\u notification\u new()的源代码,它在内部执行一个g\u object\u new(),获取一个GObject*,并将其作为NotfiyNotification*返回,所以当我的应用程序执行清理时,我应该调用g\u

我正在使用libnotify在我的浏览器中显示桌面通知;返回一个
NotifyNotification*
,它应该作为第一个参数传递给通知库的进一步函数调用


没有任何
notify\u notification\u free()
可以释放它返回的指针。我查找了
notify\u notification\u new()
的源代码,它在内部执行一个
g\u object\u new()
,获取一个GObject*,并将其作为
NotfiyNotification*
返回,所以当我的应用程序执行清理时,我应该调用
g\u object\u unref()
notify\u notification\u new()

返回的指针上,答案是肯定的,我从中找到了答案,我希望它能帮助以后的人。

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

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

然后,当您销毁容器时,它在小部件上调用
g\u object\u unref()
,引用计数变为零,小部件被销毁。这样你就不用为自己毁掉它负责了


因此,对于一般的
GObject
s(通常不放入容器中),不存在所有权转移。完成后,您必须自己取消引用它们。

@ptomoto我需要调用哪些额外的头文件
g\u object\u unref()
?我目前只包括
libnotify/notify.h
\include
@ptomato,为什么他们在GTreeModel上使用
g\u object\u unref(model)
。那么这是他们代码中的错误吗?他们正在将
模型添加到
GtkTreeView
中。或者是因为
GtkTreeView
不是
GtkContainer
为什么他们必须调用
g_object\u unref
GtkTreeModel
不是
gininitiallyunowned
的子类(参见上面的第一段),所以它没有浮动引用。