将glib缓冲区释放两次是否安全?

问题描述 投票:1回答:2

是否安全或禁止将glib g_malloc函数分配的缓冲区释放两次?

char *buffer = g_malloc(10);
g_free(buffer);
g_free(buffer);
c memory-management glib double-free
2个回答
4
投票

来自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
投票

tl;博士:没有。

它完全等同于在相同的分配上调用free()两次,leads to undefined behaviour

© www.soinside.com 2019 - 2024. All rights reserved.