我正在释放分配给b
的内存。但我的印象是,动态分配的内存在"释放"之后就会消失。但是我没有得到任何错误与这段代码,我仍然可以访问分配给b
的元素的原始值,甚至在释放它之后。这怎么可能呢?我该怎么做才能完全擦除b
?
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(int argc,char* argv[])
{
int i, imax;
int *b;
imax=5;
b=malloc(sizeof(int)*imax);
for (i=0; i < imax; i++)
{
b[i]=i*i;
printf("%d ",b[i]);
}
free(b);
printf("n memory freed n");
for (i=0; i < imax; i++)
{
printf("%d ",b[i]);
}
printf("n");
return 0;
}
使用GCC编译并运行后的结果
0 1 4 9 16
memory freed
0 1 4 9 16
这是未定义行为的一个例子。有许多不同的可能性,包括:
- 内存读取是完全相同的,因为C库只是将其标记为空闲而不触及它
- 内存读取是垃圾,因为其他东西重用了新释放的块
- 你的程序崩溃了,因为地址不再被接受。你的电脑向南极洲发射了一枚核导弹,因为任何都有可能产生未定义的行为!
所以,为了可爱的小企鹅,请避免阅读释放内存!
在使用free
释放对象之后访问它会调用未定义的行为。别这么做。
:
for (i=0; i < imax; i++)
{
printf("%d ",b[i]); // invokes undefined behavior!
}
如果你运气不好,什么也不会发生,但从撞车到鼻魔,一切都有可能发生。