2014-03-05 58 views
3

我使用glib與GValue,GPtrArray和GValueArray與dbus進行通信。我的代碼中有很大的內存泄漏。我正在用glib 2.32.4運行一個嵌入式目標。這是我第一次在代碼中使用glib類型,所以我不是很熟悉所有這些結構。正確使用GPtrArray和GValueArray與glib dbus

消息定義是:

<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); 
} 

我試圖添加一些NULL在上部結構,其OUT_DATA。但是,如果我試圖將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 

巧舌如簧的dbus必須通過本身,而是我的情況下釋放我所有的結構,這是行不通的。我也嘗試過運行valgrind但它沒有看到任何東西...

謝謝&關注 亞瑟。

回答

2

對於每個g_value_array_new您必須致電g_value_array_free。就像每個new一樣,你必須有相應的delete

+0

我不能釋放我通過dbus發送的消息!必須釋放我的信息的過程是dbus。 – ArthurLambert

+0

我敢肯定,如果相應的'g_value_array_new'已經在另一個進程中創建,則不能調用'g_value_array_free'。 –

+0

那爲什麼這個答案是完全錯誤的。我試圖繼續在這段代碼中發現泄漏,但沒有成功。相當令人沮喪。我知道泄漏是在這段特定的代碼中,卻無法找到它! – ArthurLambert