【问题标题】:g_array_free vs g_array_unref. Which one to use?g_array_free 与 g_array_unref。使用哪一个?
【发布时间】:2021-07-07 13:14:33
【问题描述】:

g_array_freeg_array_unref 有什么区别?我应该什么时候使用g_array_free?我什么时候应该使用g_array_unref

【问题讨论】:

    标签: glib


    【解决方案1】:

    如果GArray 的引用计数器是1 则没有区别(假设您将TRUE 传递给free_segment 参数g_array_free)。 g_array_unref 的结果和g_array_free 的结果是一样的。

    但如果引用计数器大于1,则存在差异。这两个函数都将引用计数器减少了1。但是g_array_free 也将数组大小设置为0 释放其所有元素。对数组的其他引用仍然有效(但我不确定使用数组本身是否有效)。只有当它的引用计数减少到0g_array_unrefg_array_free)时,该数组才会被完全释放。

    g_array_free 还有一个额外的参数free_segment。如果是TRUE,那么数组元素在调用后被释放。如果是FALSE,则元素在函数结果中以原始C 数组(T*T[])的形式返回。这实际上是从数组中分离数据。

    g_array_unref 是线程安全的,g_array_free 不是。这是因为g_array_unref 原子地减少了引用计数,如果不是0,该函数什么也不做。 g_array_free 也会自动减少引用计数。但如果它不是0,它仍然在数组上运行——将它的大小设置为0。更改数组大小不是原子的,并且不使用锁定,因此它不是线程安全的。

    其实GArray的代码很简单,it可以自己学。

    什么时候应该使用 g_array_free?什么时候应该使用 g_array_unref?

    我会说只有当你想将数组元素作为 C 数组时才使用g_array_free。但实际上您可以为此使用g_array_steal。所以我根本不会使用g_array_free。请改用g_array_unref

    【讨论】:

      猜你喜欢
      • 2016-10-06
      • 2018-07-31
      • 2012-07-19
      • 1970-01-01
      • 2018-01-30
      • 1970-01-01
      • 1970-01-01
      • 2011-12-20
      • 2010-11-08
      相关资源
      最近更新 更多