C 一个新的g_对象是否应该有一个匹配的g_对象?
我正在使用libnotify在我的浏览器中显示桌面通知;返回一个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
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
的子类(参见上面的第一段),所以它没有浮动引用。