如何正确处理GLib中的浮动参考参数?

如何正确处理GLib中的浮动参考参数?,glib,gobject,Glib,Gobject,GLib中有浮动引用对象 container = create_container(); container_add_child(container, create_child()); 在本例中,create\u child函数创建不属于任何人的浮动对象。container\u add\u child函数获得对象的所有权,并成为对象的唯一所有者。当它与对象断开连接时,对象被释放 但是如果container\u add\u child函数没有获得对象的所有权怎么办?在这种情况下,我们会出现内存泄

GLib中有浮动引用对象

container = create_container();
container_add_child(container, create_child());
在本例中,
create\u child
函数创建不属于任何人的浮动对象。
container\u add\u child
函数获得对象的所有权,并成为对象的唯一所有者。当它与对象断开连接时,对象被释放

但是如果
container\u add\u child
函数没有获得对象的所有权怎么办?在这种情况下,我们会出现内存泄漏。是的,对象不属于任何人,但它仍然存在于内存中,并且没有人释放对象的内存

如果我们写一个函数,把这样的对象作为一个参数呢

void handle_object(gpointer object)
{
    g_object_ref_sink(object);
    
    // Doing something with object
    
    g_object_unref(object);
}
我们是否必须将
g\u object\u ref\u sink
/
g\u object\u unref
添加到每个将潜在浮动引用对象作为参数的函数中?如果我们删除这些行,那么可能会有人发出这样的调用:
handle\u object(create\u child())
,我们将得到内存泄漏。对象将永远“浮动”在内存中

我们是否必须将
g\u object\u ref\u sink
/
g\u object\u unref
添加到每个将潜在浮动引用对象作为参数的函数中

是的,这就是为什么围绕浮动引用构建API很痛苦的原因之一。最好不要使用它们,而是使用显式(
(无传输)
(完全传输)