gpt4 book ai didi

glib - 何时取消引用具有 float 引用的 GVariant?

转载 作者:行者123 更新时间:2023-12-04 14:26:48 26 4
gpt4 key购买 nike

https://developer.gnome.org/glib/unstable/glib-GVariant.html#g-variant-ref-sink

我已经阅读了上面的 glib 手册,上面写着:“GVariant 使用 float 引用计数系统。所有名称以 g_variant_new_ 开头的函数都返回 float 引用。”但是关于什么是 float 引用计数的实际描述在哪里呢?我找不到它的全面描述。

特别是我想了解何时需要取消引用变体以及何时不需要。例如:

GVariant *a_v = g_variant_new_boolean(TRUE);
GVariant *another_v = g_variant_new("v", a_v);
  • 我想我不需要取消引用 a_v因为它被第二个 g_variant_new 消耗.那是对的吗?
  • 我是否需要取消引用 another_v (假设 another_v 从那时起没有传递给其他任何东西)?
  • 这是在哪里记录的? (我认为通过从搜索过程中发现的不同示例进行推断,我有正确的理解,但似乎找不到能清楚解释这一点的官方 glib 文档)。
  • 最佳答案

    floating references上有一段在 GObject 引用手册中进行了更详细的介绍。 float 引用可能看起来有点晦涩,但它们对 C 语言非常有用,因此花几分钟时间来真正理解它们是个好主意。

    我假设您了解引用计数的工作原理——如果没有大量文档,请先花几分钟阅读。

    首先,让我们看看如果 g_variant_new_boolean 的示例会发生什么情况?返回一个常规的引用。当您第一次获得该值时,引用计数将为 1。当您将其传递给 g_variant_new 时, g_variant_new会将引用计数增加到 2。在某些时候,我假设您将处理 another_v ,此时 a_v 的引用计数将下降到 1……但请记住,直到引用计数达到 0 才会释放内存。

    为了解决这个问题,您有两种选择。首先是制作g_variant_new窃取调用者的引用,这基本上是一种解决方案。当您调用 g_variant_new 时,您会泄露您的推荐信。 (或任何类似功能),所以将来您需要手动引用 a_v每次你想把它传递给别的东西。

    另一种选择是在完成后手动取消引用它。这不是世界末日,但很容易忘记做或出错(比如忘记在错误路径中取消引用它)。

    GVariant 所做的是返回一个“ float ”引用。想到它的最简单方法(恕我直言)是第一次 g_variant_ref被调用它并没有真正做任何事情——它只是“沉没” float 的 ref。引用计数从 1 变为 1。随后调用 g_variant_ref但是,会增加引用计数。

    现在让我们看看您的示例实际发生了什么。 g_variant_new_boolean返回一个 float 引用。然后将其传递给 g_variant_new , 调用 g_variant_ref ,它会下沉 float 引用。引用计数现在为 1,当 another_v的引用计数达到 0 a_v的引用计数将减少,在这种情况下达到 0 并且所有内容都将被释放。您无需调用g_variant_unref .

    不过, float 引用最酷的部分是这样的事情:

    GVariant *a_v = g_variant_new_boolean(TRUE);
    GVariant *another_v = g_variant_new("v", a_v);
    GVariant *yet_another_v = g_variant_new("v", a_v);

    g_variant_new第二次调用 a_v的引用计数将再次增加(增加到 2)。无需调用 g_variant_ref通过前 a_vg_variant_new第二次——第一次调用看起来和第一次一样,一致性是 API 中一个非常好的特性。

    此时可能很明显,但是是的,您确实需要调用 g_variant_unrefanother_v (并且,在最后一个示例中, yet_another_v )。

    关于glib - 何时取消引用具有 float 引用的 GVariant?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29662609/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com