【问题标题】:Free allocated memory in C [duplicate]在 C 中释放分配的内存 [重复]
【发布时间】:2015-11-28 15:52:26
【问题描述】:

假设我分配了一个足够大的char** 数组。

为什么我可以free(arr) 而不是free(arr + 5)

请注意,我说的不是arr[0]arr[5]

【问题讨论】:

  • 主要是因为标准是这么说的。出于更多技术原因,一些malloc() 实现将簿记数据放在分配的内存区域之前。将指针 malloc() 传递给 free() 之外的其他内容会导致 free() 将垃圾数据解释为具有致命后果的簿记数据。
  • 谢谢,我明白了。

标签: c arrays memory free


【解决方案1】:

您始终使用malloc()realloc()calloc() 返回的指针调用free()。您不得传递任何其他指针。

来自free() 手册:

free() 函数释放 ptr 指向的内存空间, 必须由先前调用 malloc()、calloc() 或 重新分配()。否则,或者如果 free(ptr) 已经被调用 之前,会发生未定义的行为。如果 ptr 为 NULL,则不进行任何操作 执行。

【讨论】:

  • 不应如“不得”。
  • 谢谢,我明白了。
  • @FUZxxl 确实。谢谢。
【解决方案2】:

malloc(3) 不能这样工作。它在内存中分配一个固定大小的数据块,在块的开头添加元数据(如下一个空闲块的地址或块的大小)并返回元数据之后的地址。

free(3)需要元数据中包含的信息才能执行(例如,更新其链表中空闲块的地址。如果提供了一个未被malloc(3)分配的指针,则元数据不存在,free 无法做到这一点。

因此,free(3) 的手册页明确禁止传递尚未由 `malloc(3) 分配的指针

free()函数释放ptr指向的内存空间, 必须由先前对malloc() 的调用返回, calloc(),或realloc()。否则,或者如果free(ptr) 已经 之前调用过,会发生未定义的行为。如果ptrNULL, 不执行任何操作。

这样做可能会导致未定义的行为,如果您的系统没有设置一些保护措施来防止您这样做,可能会导致安全漏洞,因为free(3)写入伪元数据指向的任意内存区域。

【讨论】:

  • 谢谢,我明白了。
  • 那么请标记解决您问题的答案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-28
  • 1970-01-01
  • 2019-01-07
  • 2016-04-06
  • 1970-01-01
相关资源
最近更新 更多