【问题标题】:How should I free all memory created using multiple realloc?我应该如何释放使用多个 realloc 创建的所有内存?
【发布时间】:2018-06-07 08:30:30
【问题描述】:

我使用 malloc 创建了 10 个整数大小的数组。我为元素添加了值。然后,我将它重新分配到 newArr 中的 200 个字节。然后我再次将 newArr 重新分配到大小为 10 个整数的 newArr2 中。代码:

void main(){

    int i, *arr = (int *)malloc(10* sizeof(int));

    for(i=0; i<10; i++){
        arr[i] = i;
    }

    int *newArr = (int *)realloc(arr, 200);

    int *newArr2 = (int *)realloc(newArr, 10* sizeof(int));

}

我应该如何使用 free 来删除这里所有分配的内存?我在清除所有这些时遇到错误。

编辑:根据接受的答案,旧内存应该已被清除,但它没有。我能够访问内存并能够更改旧地址的值。

【问题讨论】:

  • 这段代码的哪一部分甚至试图“清除”任何东西?
  • 我已将其删除。它是免费的(arr);免费的(新的);免费(newArr2);
  • void main() 是非标准的,使用int main(void)。向他人展示您的代码时,切勿省略 #include 指令。

标签: c gcc


【解决方案1】:

在我看来,当您使用 malloc 或 realloc 时,您正在更改内存引用,因此,如果您在变量上调用 realloc,您将释放已使用的旧空间并分配新空间,将旧数据复制到新的内存位置,因此,在您的示例中,arr 在第一次重新分配后没有有效的内存地址。同样的事情发生在newArr

【讨论】:

  • 但是当我读取那些旧地址的值时,它显示的是相同的旧值。正常吗?我再检查几件事。
  • 即使在重新分配后我也能够处理 arr。我更改了值,检查了地址,并且能够在运行时执行所有操作。
  • Max,注意realloc可能返回一个新地址,但不是必须的,例如在当前分配的内存之后有足够的空闲内存时只会扩大分配。在所有情况下,重要的是要提到可能只有 一次 调用 free 来释放内存。
  • 即使在它完全重新定位到一个新地址之后,它也不会释放旧的数组内存。它仍然可以访问并包含价值。我认为完全清除内存的唯一方法是比较旧地址和新地址,然后相应地释放它们。
  • The content of the memory block is preserved up to the lesser of the new and old sizes, even if the block is moved to a new location. If the new size is larger, the value of the newly allocated portion is indeterminate. from cplusplus.com/reference/cstdlib/realloc 所以,这是真的
【解决方案2】:

realloc 基本上是 malloc 的新大小,memmove 新块的数据和 free 旧块。 (但是实现可以优化这个过程,因为他们有更多可以使用的信息,比如扩展当前分配的块,产生相同的指针)

所以指针arrnewArr 是无效的,不应该再被访问,因为它们可能是freed,所以newArr2 中的指针是当前的并且有效的,如果之前的分配没有失败。所以free(newArr2)是正确答案。

当然,您可能会从旧指针访问内存,但这不能保证,因为它可能已被分配和覆盖用于不同的目的,或者您可能只是幸运地从 realloc 得到相同的指针(因为例如上面的优化)。这只是访问freed 内存时未定义的行为。

Source on reddit

【讨论】:

  • 重要的是要在此处添加,我认为您错过了正确指出,如果任何对 realloc() 的调用失败,您的指针不会得到 free()d;也就是说,如果newArr 变成NULL,你必须仍然是free(arr),如果newArr2 变成NULL,你必须分别还是free(newArr)
猜你喜欢
  • 2020-03-23
  • 2016-11-16
  • 2018-03-09
  • 1970-01-01
  • 2016-03-10
  • 1970-01-01
  • 1970-01-01
  • 2017-05-01
  • 1970-01-01
相关资源
最近更新 更多