2

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

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

2 回答 2

5

来自glib/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)will call将standard_free(mem)调用free(mem). 因为这样做是无效的:

 void *mem = malloc(1);
 free(mem);
 free(mem); // undefined behavior

g_free两次调用同一个内存指针是无效的,因为它在内部调用free它的参数。

于 2019-04-04T08:26:20.277 回答
1

tl;博士:不。

这完全等同于调用free()相同的分配两次,这会导致未定义的行为

于 2019-04-11T01:11:43.167 回答