-2

可能重复:
为什么在释放指针后取消引用指针时会得到不同的结果?

在字符的情况下也尝试过,它做了什么,在 8 个值之后第 9 个值是正确的,而前 8 个显示垃圾值,就像这里的情况一样,前两个值显示垃圾,而第三个值是原样。因此只有前 8 个字节被释放。为什么会这样?您还可以增加要检查的数组中的索引数。有人请解释一下 FREE() 方法在这里如何工作?

#include<iostream>
using namespace std;
#include<conio.h>
int main()
{
int *arr;
arr=(int *)malloc(sizeof(int)*3);
arr[0]=10;
arr[1]=20;
arr[2]=30;

free(arr);
for(register int i=0;i<3;i++)
{
cout<<arr[i]<<endl;
}
getch();
return 0;
}
4

3 回答 3

0

释放 arr 后,您正在使用它的值。那是无效的,并且没有定义任何结果。在这种情况下,我猜你的 free 实现是使用前 8 个字节来保存一些记录(例如空闲列表指针或伙伴长度)。

于 2013-01-16T20:39:04.770 回答
0

free()基本上只是告诉运行时系统“我已经完成了这个内存,你可以在方便的时候将它重用于其他事情。” 换句话说,free()完全不支持在之后读取内存,并且可能会给出任何价值,包括从准确读回您编写的内容到使程序崩溃的范围内的任何内容。

于 2013-01-16T20:39:06.167 回答
0

对 free() 的调用通知内存分配器该内存可以在将来的分配中重用。它不会以某种方式神奇地使您之前收到的指针无效。那个指针仍然指向……某处。根据系统中发生的其他情况,您的原始值可能仍位于指向的内存位置。

如果

arr=(int *)malloc(sizeof(int)*3);

设置arr为 say 0xabcdabcd(表示内存中的地址),arr在您调用free. 那个地址还有东西。那东西可能是也可能不是你放在那里的价值观。

于 2013-01-16T20:39:53.380 回答