Hi Simon,

First, when I put all the free that I have to put, the code get a
segfault. In fact It seems that I just have to use g_ptr_array_free on
the upper structure that is the ptr_array to free all memory. If I put
more free, I get plenty of invalid free though valgrind test and
segfault.

Second, How can you explain that I am not able to see any leak with ps
aux command if I put a loop in my main (or only on some specific
target) ? Do they have a way to garbarge memory in glib ?

Last point is I am currently using this code in dbus. I cannot use
free because all this structure is send though dbus. I get a pointer
by argument on a callback. I use the pointer to set the answer. So I
suppose that dbus must free all the structure by itself riight ?

Regards,
Arthur.

2014-03-06 12:58 GMT+01:00 Simon Kågedal Reimer <[email protected]>:
> Hi Arthur,
>
> In C code, memory is managed manually. Every time you dynamically allocate
> memory, such as with GLib's various _new() functions, you need to return
> that chunk of memory to the system when you are done using it. I see no such
> calls in your code. For example, a GPtrArray created with g_ptr_array_new()
> should have a matching call to g_ptr_array_unref() or g_ptr_array_free(). A
> call to g_new0 should have a matching g_free, I don't know why you have
> commented that out. And so on.
>
> Best regards! Simon
>
>
> On Tue, Mar 4, 2014 at 3:44 PM, Arthur Lambert <[email protected]>
> wrote:
>>
>>
>> Hi All,
>>
>> I am using glib with GValue, GPtrArray to communicate with dbus. I
>> have a big memory leak in my code. I am running an embedded target
>> with glib 2.32.4. I am currently trying to  code some little binary to
>> detect the leak. I am not the author of the code so it is quite hard
>> for me to debug it.
>>
>> So I have currently for example a little main which does not leak at
>> all on a desktop linux version (Fedora 17) which use the same glib
>> version( perhaps not exactly the same verson but major, minor and
>> macro number version seems to be the same. But when I run this piece
>> of code on my embedded linux, I have a leak of 4 Bytes per loop
>> iteration.
>>
>> Code is :
>> #define SIZE_INNER_ARRAY 5
>> ...
>>
>> static void
>> data_constructor_array_struct_string_array_struct_string_variant(GPtrArray
>> *data, const gchar *client_objname)
>> {
>>   guint member_count;
>>   GValueArray *outer_struct = g_value_array_new(1);
>>   GPtrArray *inner_array = g_ptr_array_new ();
>>
>>   printf ("client objname : %s\n", client_objname);
>>
>>   g_value_array_append(outer_struct, NULL);
>>   g_value_init(g_value_array_get_nth(outer_struct, 0), G_TYPE_STRING);
>>   g_value_set_string(g_value_array_get_nth(outer_struct, 0),
>> client_objname);
>>
>>   for(member_count=0;member_count < SIZE_INNER_ARRAY ;member_count++)
>>   {
>>     GValueArray *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);
>>
>>     char str[32];
>>     sprintf (str, "TUTU%d", member_count);
>>     g_value_set_string(g_value_array_get_nth(inner_struct, 0), str);
>>
>>     GValue *ptr = g_new0 (GValue, 1);
>>     g_value_init (ptr, G_TYPE_UINT);
>>     g_value_set_uint (ptr, member_count);
>>
>>     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), ptr);
>>     //g_free(ptr); // can remove it, but use set_static instead of set
>>
>>     g_ptr_array_add(inner_array, inner_struct);
>>   }
>>
>>   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_ptr_array_add(data, outer_struct);
>> }
>>
>> int main (void)
>> {
>>   GPtrArray *ptr_array = NULL;
>>   g_type_init ();
>>   //while (1)
>>   {
>>     ptr_array = g_ptr_array_new ();
>>     data_constructor_array_struct_string_array_struct_string_variant
>> (ptr_array, "mon objet");
>>     //sleep (3);
>>   }
>>   return 0;
>> }
>>
>> To summarize the code. I have an outer_struct which is a GValueArray.
>> First element is a gvalue with a string. Second element is inner_array
>> which is a GPtrArray. Each element of inner_array is a innner_struct
>> which is a GValueArray compose of two elements. As you can see in this
>> example I am adding 5 inner_struct in the inner_array.
>>
>> Do I am doing something wrong in this code ? Do I have a memory leak
>> in my glib version ?
>> I hope that it is the good place to ask my request.
>>
>> Thanks & Regards
>> Arthur.
>> _______________________________________________
>> gnome-devel-list mailing list
>> [email protected]
>> https://mail.gnome.org/mailman/listinfo/gnome-devel-list
>
>



-- 
- Arthur LAMBERT
_______________________________________________
gnome-devel-list mailing list
[email protected]
https://mail.gnome.org/mailman/listinfo/gnome-devel-list

Reply via email to