Безопасно ли дважды освобождать буфер glib? - PullRequest
1 голос
/ 04 апреля 2019

Безопасно или запрещено дважды освобождать буфер, выделенный функцией glib g_malloc?

char *buffer = g_malloc(10);
g_free(buffer);
g_free(buffer);

Ответы [ 2 ]

4 голосов
/ 04 апреля 2019

С 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 для своего аргумента.

1 голос
/ 11 апреля 2019

тл; др: Нет.

Это точно эквивалентно вызову free() на одном и том же распределении дважды, что приводит к неопределенному поведению .

...