我使用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来删除所有已分配的内存?清除所有这些时我收到错误。
编辑:根据接受的答案,旧的记忆应该被清除,但事实并非如此。我能够访问内存,并能够更改旧地址的值。
realloc
基本上是malloc
与新的大小,memmove
数据到新的块和free
旧的。 (但是实现可以优化这个过程,因为他们可以使用更多的信息,比如只扩展当前分配的块,产生相同的指针)
因此指针arr
和newArr
无效,不应再被访问,因为它们可能是free
d,因此newArr2
中的指针是当前指针并且有效,如果先前的分配没有失败。所以free(newArr2)
是正确的答案。
当然,您可以从旧指针访问内存,但不能保证,因为它可能已被分配和覆盖用于不同的目的,或者您可能只是幸运地从realloc
获得相同的指针(因为来自例如。上面的优化)。访问free
d内存时,这只是未定义的行为。
从我的角度来看,当你使用malloc或realloc时你正在改变内存引用,所以,如果你在一个变量上调用realloc,你就可以释放旧的空间并分配新空间,将旧数据复制到新的内存位置因此,在您的示例中,arr
在首次重新分配后不保留有效的内存地址。同样的事情发生在newArr