在 glib dbus 中正确使用 GPtrArray 和 GValueArray

Posted

技术标签:

【中文标题】在 glib dbus 中正确使用 GPtrArray 和 GValueArray【英文标题】:Using properly GPtrArray and GValueArray with glib dbus 【发布时间】:2014-04-07 12:14:16 【问题描述】:

我正在使用带有 GValue、GPtrArray 和 GValueArray 的 glib 与 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 但它什么也没看到...

感谢和问候 亚瑟。

【问题讨论】:

【参考方案1】:

对于每个g_value_array_new,您必须调用g_value_array_free。就像每个new 你必须有一个对应的delete

【讨论】:

我无法释放通过 dbus 发送的消息!必须释放我的消息的进程是 dbus。 如果对应的g_value_array_new 已在另一个进程中生成,我很确定你不能调用g_value_array_free 这就是为什么这个答案是完全错误的。我试图继续在这段代码中找到泄漏,但没有成功。相当令人沮丧。我知道泄漏是在这段特定的代码中而无法找到它!

以上是关于在 glib dbus 中正确使用 GPtrArray 和 GValueArray的主要内容,如果未能解决你的问题,请参考以下文章

Glib:DBUS 属性中的 NULL

linux 进程间通信 dbus-glib实例详解四(下) C库 dbus-glib 使用(附代码)

linux 进程间通信 dbus-glib实例详解四(上) C库 dbus-glib 使用(附代码)(编写接口描述文件.xml,dbus-binding-tool工具生成绑定文件)(列集散集函数)

Dbus/GLib 主循环,后台线程

使用 dbus-binding-tool 的 glib dbus 服务示例?

使用 glib 和 dbus dbus_g_value_build_g_variant 构建 Maliit 时出错