С glibc / gmem.c (при условии, что вы не сделали g_mem_set_vtable
с чем-то необычным):
static void
standard_free (gpointer mem)
{
free (mem);
}
...
/* --- variables --- */
static GMemVTable glib_mem_vtable = {
standard_malloc,
standard_realloc,
standard_free,
standard_calloc,
standard_try_malloc,
standard_try_realloc,
};
...
void
g_free (gpointer mem)
{
if (G_UNLIKELY (!g_mem_initialized))
g_mem_init_nomessage();
if (G_LIKELY (mem))
glib_mem_vtable.free (mem);
TRACE(GLIB_MEM_FREE((void*) mem));
}
glib_mem_vtable.free(mem)
вызовет standard_free(mem)
, который просто вызовет free(mem)
. Как это сделать неверно:
void *mem = malloc(1);
free(mem);
free(mem); // undefined behavior
Недопустимо дважды вызывать g_free
для одного и того же указателя памяти, как для внутреннего вызова free
для своего аргумента.