int main(int argc, _TCHAR* argv[])
{
char *str = (char*)malloc(100);
strcpy(str, "hello");
free(str);
if (str)
{
strcpy(str, "world");
printf(str);
}
return 0;
}
VS上面Ctrl+F5结果输出:world
str地址处的内存不是已经被free了吗?为什么还可以存放world ????
网上看到有个人这样解释:
free函数只是把malloc申请到的内存块中某个特殊的标志变了一下而已,并没有立刻就清空内存块中的数据。
是否释放这块内存是操作系统自己来判断的,而且释放后是否会对内存块链进行调整,使内存碎片减少,都是用操作系统自己来进行的。
free(str);
之后str变成野指针,str指向无意义的内存地址,但其本身不为NULL;
(我们一般释放后都这样保证安全:str=NULL;)
使用野指针是一件十分危险的事情:直接F5会报错:HEAP: Free Heap block 5fc638 modified at 5fc660 after it was freed。这是使用野指针导致的错误