GValue初始化/完成的必要性

时间:2018-09-26 18:11:46

标签: c initialization glib finalization

我什么时候应该致电g_value_init / g_value_reset

当前,我在所有情况下都使用g_value_initg_value_reset,但是我想知道是否可以加快速度。

我至少知道:

  • 在使用对象或盒装类型时,肯定需要调用g_value_reset,因为GValue可能已经获取了引用,或者在它为GBoxed的情况下是重复的。
  • 使用guintgboolean之类的基本类型(无任何内存管理)时,从理论上讲,g_value_reset调用是不必要的,因为不应为它们分配内存。我什至已经阅读了实现,事实证明它是正确的。但是,我担心作者可能会进行更改并开始分配一些内存(或只是进行一些跟踪),然后这会导致内存泄漏。

这就是我目前所有的研究。我想扩大它,可能会得到官方文档参考的支持。预先感谢。

2 个答案:

答案 0 :(得分:1)

您当前的想法大部分是正确的。 g_value_init()必须始终用于初始化堆栈分配的GValue。每当g_value_unset()超出范围时,都必须使用GValue来为其释放任何特定于类型的数据。如果要将g_value_reset()重置为默认值,则应使用GValue。请注意,对于某些类型,这可能意味着它仍指向分配的内存。

g_value_unset()通常比g_value_reset()更频繁地使用。

答案 1 :(得分:-1)

我对该主题了解不多,但是我搜索了g_value_init,发现这些GNOME开发人员页面可能有用:

https://developer.gnome.org/gobject/stable/gobject-Generic-values.html#g-value-reset

https://developer.gnome.org/glib/stable/glib-Basic-Types.html#gboolean

看看是否有帮助