我应该如何释放使用多个realloc创建的所有内存?

问题描述 投票:-1回答:2

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

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来删除所有已分配的内存?清除所有这些时我收到错误。

编辑:根据接受的答案,旧的记忆应该被清除,但事实并非如此。我能够访问内存,并能够更改旧地址的值。

c gcc
2个回答
2
投票

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

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

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

Source on reddit


3
投票

从我的角度来看,当你使用malloc或realloc时你正在改变内存引用,所以,如果你在一个变量上调用realloc,你就可以释放旧的空间并分配新空间,将旧数据复制到新的内存位置因此,在您的示例中,arr在首次重新分配后不保留有效的内存地址。同样的事情发生在newArr

© www.soinside.com 2019 - 2024. All rights reserved.