【问题标题】:Is it safe to free a glib buffer twice?两次释放 glib 缓冲区是否安全?
【发布时间】:2019-04-04 07:59:05
【问题描述】:

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

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

【问题讨论】:

  • 不确定glib,但你为什么要这样做?
  • 你为什么想知道?你有什么问题导致你问这个问题?也许你应该直接问这个问题?
  • 一般来说,你不能释放你没有明确分配的内存。一旦你调用了一次g_free,指针指向的内存就不再被分配。
  • 感谢您的回复,我正在研究现有代码,所以我只需要知道这一点。
  • @Someprogrammerdude 我编辑了问题以显示缓冲区也由 g_malloc 分配。您回答的第二部分是我的问题 - 它是否危险,或者可能以某种方式使您可以安全地做两次。

标签: c memory-management glib double-free


【解决方案1】:

来自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) 将调用 standard_free(mem),而 free(mem) 将调用。因为这样做是无效的:

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

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

【讨论】:

  • g_mem_set_vtable() 已弃用。不要使用它。
【解决方案2】:

tl;dr:没有。

这完全等同于在同一分配上调用free() 两次,即leads to undefined behaviour

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-26
    • 2015-01-24
    • 2014-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多