diff --git a/glib/glist.c b/glib/glist.c index 7b64ba1d6..474331ab5 100644 --- a/glib/glist.c +++ b/glib/glist.c @@ -175,6 +175,13 @@ g_list_alloc (void) * * If list elements contain dynamically-allocated memory, you should * either use g_list_free_full() or free them manually first. + * + * It can be combined with g_steal_pointer() to ensure the list head pointer + * is not left dangling: + * |[ + * GList *list_of_borrowed_things = …; /* (transfer container) */ + * g_list_free (g_steal_pointer (&list_of_borrowed_things)); + * ]| */ void g_list_free (GList *list) @@ -214,6 +221,15 @@ g_list_free_1 (GList *list) * @free_func must not modify the list (eg, by removing the freed * element from it). * + * It can be combined with g_steal_pointer() to ensure the list head pointer + * is not left dangling ­— this also has the nice property that the head pointer + * is cleared before any of the list elements are freed, to prevent double frees + * from @free_func: + * |[ + * GList *list_of_owned_things = …; /* (transfer full) (element-type GObject) */ + * g_list_free_full (g_steal_pointer (&list_of_owned_things), g_object_unref); + * ]| + * * Since: 2.28 */ void diff --git a/glib/gslist.c b/glib/gslist.c index ef711f634..15b7936c6 100644 --- a/glib/gslist.c +++ b/glib/gslist.c @@ -130,6 +130,13 @@ g_slist_alloc (void) * If list elements contain dynamically-allocated memory, * you should either use g_slist_free_full() or free them manually * first. + * + * It can be combined with g_steal_pointer() to ensure the list head pointer + * is not left dangling: + * |[ + * GSList *list_of_borrowed_things = …; /* (transfer container) */ + * g_slist_free (g_steal_pointer (&list_of_borrowed_things)); + * ]| */ void g_slist_free (GSList *list) @@ -168,6 +175,15 @@ g_slist_free_1 (GSList *list) * @free_func must not modify the list (eg, by removing the freed * element from it). * + * It can be combined with g_steal_pointer() to ensure the list head pointer + * is not left dangling ­— this also has the nice property that the head pointer + * is cleared before any of the list elements are freed, to prevent double frees + * from @free_func: + * |[ + * GSList *list_of_owned_things = …; /* (transfer full) (element-type GObject) */ + * g_slist_free_full (g_steal_pointer (&list_of_owned_things), g_object_unref); + * ]| + * * Since: 2.28 **/ void