gpt4 book ai didi

c - 在 glib dbus 中正确使用 GPtrArray 和 GValueArray

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

我正在使用 glib 与 GValue、GPtrArray 和 GValueArray 来与 dbus 通信。我的代码中有很大的内存泄漏。我正在使用 glib 2.32.4 运行嵌入式目标。这是我第一次在代码中使用 glib 类型,所以我不是很熟悉所有这些结构。

消息定义为:

   <method name="GetAll">
<arg name="in" type="as" direction="in"/>
<arg name="out" type="a(sa(sv))" direction="out"/>
</method>

代码是:

void data_constructor_array_struct_string_array_struct_string_variant (GPtrArray* out_data, const gchar *client_objname)
{
guint member_count;
GValueArray *outer_struct = g_value_array_new(3);
GPtrArray *inner_array = g_ptr_array_new ();
GValueArray *inner_struct = NULL;

g_value_array_append(outer_struct, NULL);
g_value_init(g_value_array_get_nth(outer_struct, 0), G_TYPE_STRING);
g_value_set_static_string(g_value_array_get_nth(outer_struct, 0), client_objname);

for(member_count=0;param->members[member_count].members_name;member_count++)
{
if(param->members[member_count].Isneeded)
{
log_warning("%s member added %s\n", __FUNCTION__, param->members[member_count].members_name);
inner_struct = g_value_array_new(2);
g_value_array_append(inner_struct, NULL);
g_value_init(g_value_array_get_nth(inner_struct, 0), G_TYPE_STRING);
g_value_set_static_string(g_value_array_get_nth(inner_struct, 0), param->members[member_count].members_name);

g_value_array_append(inner_struct, NULL);
g_value_init(g_value_array_get_nth(inner_struct, 1), G_TYPE_VALUE);
g_value_set_static_boxed(g_value_array_get_nth(inner_struct, 1), param->members[member_count].data);

g_value_array_append(inner_struct, NULL);
g_ptr_array_add(inner_array, inner_struct);
}
}

//g_ptr_array_add(inner_array, NULL); // CRASH

g_value_array_append(outer_struct, NULL);
g_value_init(g_value_array_get_nth(outer_struct, 1), dbus_g_type_get_collection("GPtrArray",dbus_g_type_get_struct ("GValueArray", G_TYPE_STRING, G_TYPE_VALUE, G_TYPE_INVALID)));
g_value_set_boxed (g_value_array_get_nth(outer_struct, 1), inner_array);

g_value_array_append(outer_struct, NULL);
g_ptr_array_add(out_data, outer_struct);
//g_ptr_array_add(out_data, NULL); //CRASH
g_ptr_array_free (inner_array, TRUE);
}

我试图在out_data 的上层结构中添加一些NULL。但是如果我尝试将 NULL 添加到数据的末尾,我会在运行时得到这个:

(process:1568): GLib-GObject-CRITICAL **: g_value_array_get_nth: assertion `index < value_array->n_values' failed

(process:1568): GLib-GObject-CRITICAL **: g_value_copy: assertion `G_IS_VALUE (src_value)' failed

(process:1568): GLib-GObject-CRITICAL **: g_value_array_get_nth: assertion `index < value_array->n_values' failed

(process:1568): GLib-GObject-CRITICAL **: g_value_copy: assertion `G_IS_VALUE (src_value)' failed

glib dbus 必须自行释放我的所有结构,但在我的情况下,它不起作用...我也尝试运行 valgrind,但它没有看到任何东西...

感谢和问候亚瑟。

最佳答案

对于每个 g_value_array_new,您都必须调用 g_value_array_free。正如每个 new 都必须有一个相应的 delete

关于c - 在 glib dbus 中正确使用 GPtrArray 和 GValueArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22197735/

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