On Thu, 2006-09-07 at 19:35 -0700, dagang001 wrote: > #include <glib.h> > > typedef struct { > gchar * name; > gint shoe_size; > gint age; > } Person; > > > int main(int argc, char** argv) { > Person *fred = g_new(Person, 1); > GList *list = NULL; > > gint num,i; > gchar *ming[]={"aaa","bbb","ccc","ddd"}; > > > for ( i=0 ;i<4 ;i++) > { > fred->name = ming[i]; > fred->shoe_size = i+10; > fred->age=60+i; > list = g_list_append(list, fred); > } > > > num=g_list_length (list); > > for (i=0 ;i<num;i++) > { > g_print("%d '%s' %d %d \n", i, > ((Person *)g_list_nth (list,i)->data)->name, > ((Person *)g_list_nth (list,i)->data)->shoe_size, > ((Person *)g_list_nth (list,i)->data)->age); > } > > > > g_print("long%d \n\n", num); > g_list_free (list);
^^^^^^^^^^^^^^^^^^^^^^ This is a memory leak. You still have person (one instance only) fred allocated. If you did this exercise right, and allocated a new Person object for ever g_list_append, then you'd have 4 leaked person objects at this point. Supposing you did allocate a new Person object for each list item, you'd need to do this before the g_list_free call (I think): g_list_foreach(list,g_free,NULL); While C does require very manual tracking of memory allocation and deallocation, the glib routines make it very easy to clean up after yourself. In fact many of the data structures, including the trees, hashes, and so forth, allow you to assign "destructor" functions that are called on each item in the structure when the structure is freed. Using these wonderful routines, I create and destroy thousands of very large and dynamic tree structures without a single memory leak. Amazing. I love glib! I think it should be part of the standard C library. Michael > g_free(fred); > > return 0; > } > > > result: > > 0 'ddd' 13 63 > 1 'ddd' 13 63 > 2 'ddd' 13 63 > 3 'ddd' 13 63 > long4 > > help me !! > > _______________________________________________ gtk-app-devel-list mailing list gtk-app-devel-list@gnome.org http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list