Can't free it after conversion because this CalComponent is a managed wrapped over unmanaged data. So the unmanaged data has to be there till the life time of the managed wrapper class.
public static CalComponent[] ICalToCalComponentArray (IntPtr ecal_objects, Cal ecal)
{
int i = 0;
IntPtr iter = IntPtr.Zero;
int len = g_slist_length (ecal_objects);
CalComponent[] compArray = new CalComponent [len];
for (i = 0, iter=ecal_objects; iter != IntPtr.Zero; iter = gtksharp_slist_get_next (iter), i++) {
IntPtr clone = icalcomponent_new_clone (gtksharp_slist_get_data (iter));
IntPtr comp = e_cal_component_new ();
if (e_cal_component_set_icalcomponent (comp, clone))
compArray[i] = new CalComponent ( comp, ecal );
}
return compArray;
}
Traces with Debug Info : This shows that ical component was freed by GC. Why GC is doing that ? and How to stop him ?
==18720==
==18720== Thread 3:
==18720== Invalid free() / delete / delete[]
==18720== at 0x402243F: free (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==18720== by 0x68D004A: icalvalue_free (icalvalue.c:712)
==18720== by 0x68C388D: icalproperty_free (icalproperty.c:234)
==18720== by 0x68BEEB7: icalcomponent_free (icalcomponent.c:240)
==18720== by 0x689792B: free_icalcomponent (e-cal-component.c:300)
==18720== by 0x689EDE5: e_cal_component_finalize (e-cal-component.c:389)
==18720== by 0x587B340: g_object_unref (gobject.c:1793)
==18720== by 0x62926BB: e_cal_glue_free_cal_component (e-cal-glue-comp.c:172)
==18720== by 0x7250D2B: ???
==18720== by 0x7250CD2: ???
==18720== by 0x7250C38: ???
==18720== by 0x80F66B4: run_finalize (gc.c:115)
==18720== Address 0x42B9260 is 0 bytes inside a block of size 4 free'd
==18720== at 0x402243F: free (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==18720== by 0x409E564: g_free (gmem.c:187)
==18720== by 0x80A5C19: mono_struct_delete_old (marshal.c:10619)
==18720== by 0x72500A8: ???
==18720== by 0x7250056: ???
==18720== by 0x724FEBB: ???
==18720== by 0x7248F01: ???
==18720== by 0x7247FA1: ???
==18720== by 0x7247154: ???
==18720== by 0x588DFCF: g_cclosure_marshal_VOID__POINTER (gmarshal.c:601)
==18720== by 0x58746A3: g_closure_invoke (gclosure.c:490)
==18720== by 0x588CD27: signal_emit_unlocked_R (gsignal.c:2510)
Traces without Debug Info :
==6699==
==6699== Invalid free() / delete / delete[]
==6699== at 0x402243F: free (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==6699== by 0x67E6BCA: icalvalue_free (in /usr/lib/libecal-1.2.so.7.0.2)
==6699== by 0x67DAE7D: icalproperty_free (in /usr/lib/libecal-1.2.so.7.0.2)
==6699== by 0x67D62E7: icalcomponent_free (in /usr/lib/libecal-1.2.so.7.0.2)
==6699== by 0x67AEC8B: (within /usr/lib/libecal-1.2.so.7.0.2)
==6699== by 0x67B6145: (within /usr/lib/libecal-1.2.so.7.0.2)
==6699== by 0x56C1BFA: g_object_unref (in /usr/lib/libgobject-2.0.so.0.1400.1)
==6699== by 0x5D336BB: e_cal_glue_free_cal_component (e-cal-glue-comp.c:172)
==6699== by 0x7168F23: ???
==6699== by 0x7168DF6: ???
==6699== by 0x7168D28: ???
==6699== by 0x80F66B4: (within /usr/bin/mono)
==6699== Address 0x42CD1D8 is 0 bytes inside a block of size 4 free'd
==6699== at 0x402243F: free (in /usr/lib/valgrind/x86-linux/vgpreload_memcheck.so)
==6699== by 0x408ABD0: g_free (in /usr/lib/libglib-2.0.so.0.1400.1)
==6699== by 0x80A5C19: (within /usr/bin/mono)
==6699== by 0x71680F8: ???
==6699== by 0x71680A6: ???
==6699== by 0x7167EF3: ???
==6699== by 0x7160F11: ???
==6699== by 0x715FFA1: ???
==6699== by 0x715F154: ???
==6699== by 0x56CC189: g_cclosure_marshal_VOID__POINTER (in /usr/lib/libgobject-2.0.so.0.1400.1)
==6699== by 0x56BF918: g_closure_invoke (in /usr/lib/libgobject-2.0.so.0.1400.1)
==6699== by 0x56D2D95: (within /usr/lib/libgobject-2.0.so.0.1400.1)