【问题标题】:Does realloc deallocate before trying to allocate new memory?在尝试分配新内存之前是否重新分配?
【发布时间】:2020-04-24 06:11:20
【问题描述】:

我在这里的练习遇到问题 - 我想进一步了解 realloc 函数 -

如果我们发送一个指向 realloc 的指针,它分配内存失败 [返回 null] 以前分配的内存现在被释放了吗?虽然我们失败了?

ePointer = (Element*)realloc(stack->content, (sizeof(Element) * capacityOfStack(stack) * 2));

stack->content是当然的指针时,如果我们现在失败了ePointer作为NULL,那么stack->content就不再被分配了?

非常感谢!!

【问题讨论】:

  • 如果有人也能回答这个问题,那就太好了 - 如果我们重新分配到更少的字节数,那么我们将 100% 不会得到 NULL?
  • 仅当重新分配成功时。与第一次尝试相同的规则。
  • C 标准中不能保证重新分配到更少的字节会成功(尽管我猜大多数实现不会失败这样的重新分配)。为了安全起见,即使在这种情况下,您也应该检查故障。失败时,您可以继续使用旧缓冲区,因为它已经足够大了。

标签: c realloc


【解决方案1】:

realloc() 在尝试再次分配之前不会取消分配。它所做的是首先尝试分配一个新块。如果失败,则返回并且旧指针仍然有效。如果成功,则将原块中的内容复制到新块中,然后在原块上调用free()

【讨论】:

    【解决方案2】:

    来自man 3 realloc

    如果realloc() 失败,原始块保持不变;它没有被释放或移动。

    【讨论】:

      【解决方案3】:

      stack->content 仍然有效。如果realloc 失败,它返回NULL,但旧的内存块仍然有效,这就是接口。

      https://en.cppreference.com/w/c/memory/realloc

      【讨论】:

        【解决方案4】:

        来自man 页面realloc

            For realloc(), the input pointer is still valid if reallocation failed.
        

        【讨论】:

          猜你喜欢
          • 2021-12-30
          • 2021-01-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-17
          • 1970-01-01
          相关资源
          最近更新 更多