【发布时间】:2021-07-07 13:14:33
【问题描述】:
g_array_free 和 g_array_unref 有什么区别?我应该什么时候使用g_array_free?我什么时候应该使用g_array_unref?
【问题讨论】:
标签: glib
g_array_free 和 g_array_unref 有什么区别?我应该什么时候使用g_array_free?我什么时候应该使用g_array_unref?
【问题讨论】:
标签: glib
如果GArray 的引用计数器是1 则没有区别(假设您将TRUE 传递给free_segment 参数g_array_free)。 g_array_unref 的结果和g_array_free 的结果是一样的。
但如果引用计数器大于1,则存在差异。这两个函数都将引用计数器减少了1。但是g_array_free 也将数组大小设置为0 释放其所有元素。对数组的其他引用仍然有效(但我不确定使用数组本身是否有效)。只有当它的引用计数减少到0(g_array_unref 或g_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。
【讨论】: