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)