我一直在尝试了解free()
函数如何工作的一些测试。以下是我的代码,后面是基于我所理解的一些问题。
int n=0,i=0;
scanf("%d",&n);
int *A = (int*)malloc(n*sizeof(int));
for (i=0;i<n;i++)
{
A[i]=2*i;
printf("A[%d] = %d\n",i,*(A+i));
}
printf("Address of A is = %d\n",A);
free(A);
for (i=0;i<n;i++)
{
printf("%d\n",*(A+i));
}
printf("Address of A is = %d\n",A);
我不明白为什么在free(A)
之后,A的值仍然相同?免费后不应该有一些垃圾价值吗?为什么A的地址保持不变?在记忆方面释放A后真的发生了什么?
答案 0 :(得分:3)
free
将内存返回给堆。它没有说明它对内存内容的作用,事实上,通常的行为是“它什么都不做”(也就是说,它不会执行数据本身的读取或写入,只是更新堆跟踪信息将该内存标记为可重用或将其返回给操作系统。
你不应该依赖于此; use-after-free是未定义的行为,因此它可以做任何想做的事情。在实践中,在释放后立即读取大量分配可能会导致故障,而小分配将继续工作,直到新malloc
重用该空间,但您不能依赖任何此类,并且它的系统和使用特定模式。
如果您访问free
内存,那么您做错了,最终会咬你。