如何正确管理 g_dbus_interface_get_object() 返回的引用

How to correctly manage references returned by g_dbus_interface_get_object()

我有一个应用程序,我在其中使用 UDisks 来处理一些驱动器和分区。在我的应用程序中,我有一个指向 UDisksDrive 的指针,我需要将其转换为 UDisksObject 指针,以后我可以通过它访问其他接口。我很不清楚应该取消引用哪些对象以及何时取消引用。在一个函数中,我目前做的是:

    UDisksDrive* drive = udisks_client_get_drive_for_block(client, block);
    if(drive == NULL) {
        g_object_unref(block);
        return NULL;
    }

    UDisksObject* driveObject = (UDisksObject*) g_dbus_interface_get_object(G_DBUS_INTERFACE(drive));
    g_object_unref(drive);
    return driveObject;

但我不知道这样说对不对。它有效,但我知道这不一定意味着什么。 g_dbus_interface_get_object() 的 gdbus 文档读起来好像我不应该在接收函数完成时取消引用返回的 driveObject 变量,但我不确定。我觉得我也应该在函数 returns 之前取消引用 block,但我不知道为什么我不这样做。这是一个我只有时间在这里和那里工作的项目,我觉得也许我已经尝试过了,但它导致了崩溃或异常。

我的其他大部分涉及 UDisks 的代码都非常简单。我 _get_ 一些东西,使用它,然后取消引用它。就是这个涉及接口交换的东西让我有点模糊。

思考、研究和在 IRC 上进行简短聊天的时间导致了以下结果:

是的,我确实需要在函数 returns 之前释放(取消引用)block。此外,g_dbus_interface_get_object() 是这种情况下的错误函数。因为我不关心 drive 而只想 returns driveObject,所以我需要使用 g_dbus_interface_dup_object() 来代替,这允许返回的指针拥有它自己的引用。这使得调用者可以在完成后安全地释放 driveObject 。所以更新后的代码片段如下所示:

    UDisksDrive* drive = udisks_client_get_drive_for_block(client, block);
    if(drive == NULL) {
        g_object_unref(blockObject);
        g_object_unref(block);
        return NULL;
    }

    UDisksObject* driveObject = (UDisksObject*) g_dbus_interface_dup_object(G_DBUS_INTERFACE(drive));
    g_object_unref(block);
    g_object_unref(drive);
    g_object_unref(blockObject);

    return driveObject;