背景
我正在使用 GLib 和变体。
我有这种情况,我想深入了解变体中的值。
初始变体changed_properties
的格式为a{sv}
.
// Example 1
/* GVariant *variant = g_variant_get_variant(
g_variant_get_child_value(g_variant_get_child_value(changed_properties, 0), 1));
*/
GVariant *changed_property = g_variant_get_child_value(changed_properties, 0);
// Example 2
GVariant *changed_property_variant = g_variant_get_variant(g_variant_get_child_value(changed_property, 1));
// Unref only frees g_variant_get_variant
// Example 3
GVariant *changed_property_variant_child = g_variant_get_child_value(changed_property, 1);
GVariant *changed_property_variant = g_variant_get_variant(changed_property_variant_child);
// Unref the objects and let reference counter get rid of used memory
g_variant_unref(changed_property_variant);
g_variant_unref(changed_property_variant_child);
我的理解
据我了解,要提取v
(这是一个变体),我必须首先从字典{sv}
数组中提取第一个。在示例 3 中,我在示例 1中的注释代码之后的sv
第一个函数调用中执行此操作。g_variant_get_child_value(changed_properties, 0)
现在我得到了一个形式为{sv}
. 要提取变体,我必须再次调用g_variant_get_child_value(changed_property, 1)
(其中索引 0 是字符串,索引 1 是{sv}
字典中的变体。
问题
调用示例 1和示例 2中的函数时会出现此问题。g_variant_get_child_value()
从,获得的所有内存引用g_variant_get_variant()
,除了最后一次将引用放入变量的调用之外,都将丢失并且不能被取消引用(如示例 3中所示)。
问题
所以我的问题是:如何在不创建这么多对象并通过引用处理这么多内存的情况下深入了解v
其内容?GVariant