【问题标题】:Free memory in c without using free() function [duplicate]在不使用 free() 函数的情况下释放 c 中的内存 [重复]
【发布时间】:2014-03-15 16:07:26
【问题描述】:

我尝试过在不使用free() 的情况下释放内存,如下所示

int *ptr = malloc(20);
realloc(ptr, 0);

会有用吗?

【问题讨论】:

  • 如果你能给出你为什么不想使用免费的理由会更好...面试问题?
  • 请问为什么这个问题被标记为recursionmarco

标签: c free realloc


【解决方案1】:

C 语言标准在这一点上有所不同:在 C90 中传递零大小与调用 free 相同:

如果 size 为零,之前在 ptr 分配的内存将被释放,就像调用 free 一样,并返回一个空指针。

但是,这在 C99 中发生了变化:

如果 size 为零,则返回值取决于特定的库实现:它可能是空指针或其他不应取消引用的位置。

请注意,不再需要释放;当传递零大小时,两者都不会返回NULL

【讨论】:

  • +1 用于捕捉语言变化,我没有
  • +1。我认为这里的总结是:“如果你想免费,那么使用free(),因为你不能依赖realloc(0)”。
  • 整洁。它在 C11 中再次发生变化。
  • 所以结论是,它取决于每个人的 cmets 的 C 库实现。
  • @amman059 正如 Oli Charlesworth 上面提到的,最安全的方法是在您希望释放内存时调用 free。此更改的另一个后果是,除非您确定编译代码所使用的 C 语言版本,否则不应调用大小为零的 realloc
【解决方案2】:

realloc(ptr, 0) 不等同于free(ptr)

标准C11 说:

如果请求的空间大小为零,则行为是实现定义的: 要么返回一个空指针,要么行为就像大小是一些 非零值,除了返回的指针不得用于访问 目的。

为什么是因为realloc 做了下面的事情,

  1. 它创建指定大小的新内存。
  2. 将内容从旧内存复制到新内存。
  3. 释放旧记忆
  4. 返回新内存的地址

【讨论】:

  • 其实就是说传入0的行为是实现定义的。
  • @EdS。没错,它的实现已定义。答案已编辑。
【解决方案3】:

也许,但你不能指望它。来自文档:

如果 new_size 为零,则行为由实现定义(可能会返回空指针,或者可能会返回一些可能不用于访问存储的非空指针)。

【讨论】:

  • 来自手册页:如果 size 等于 0,并且 ptr 不为 NULL,则调用相当于 free(ptr)
  • @delannoyk:Linux 手册页不是 C 标准。我确实改变了我原来在那里的东西,尽管我事先并不知道这种行为。学到了一些新东西。
【解决方案4】:

至少对于 POSIX:realloc(p, 0)free(p) 不同。

来自the current POSIX documentation on realloc()

以前的版本明确允许调用 realloc (p, 0) 以释放 p 指向的空间并返回一个空指针。虽然这种行为可以解释为该版本的标准允许,但 C 语言委员会表示这种解释是不正确的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-16
    • 2012-12-05
    • 1970-01-01
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多