为什么在C ++中free()函数只释放8个字节的内存?

时间:2013-01-16 20:35:33

标签: memory-management malloc free dynamic-memory-allocation realloc

  

可能重复:
  Why do I get different results when I dereference a pointer after freeing it?

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

#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;
}

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

free()基本上只告诉运行时系统“我已经完成了这个内存,随时可以在其他方面重复使用它。”换句话说,在free()完全不受支持之后读取内存并且可以给出任何值,包括从回读你所写的内容到崩溃程序的范围内的任何内容。

答案 2 :(得分:0)

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

如果

  

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

arr设置为0xabcdabcd(表示内存中的地址),arr在调用free后仍设置为该确切值。还有一些东西在那个地址。那些东西可能是也可能不是你放在那里的价值。