如何正确管理 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;
我有一个应用程序,我在其中使用 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;