代码:
char *string=(char*)malloc(60);
memcpy(string,”hellow world”,12);
printf(“before free string is:%s\n”,string);//结果:hellow world
free(string);
printf(“after free string is:%s\n”,string);//结果:空
char *string=(char*)malloc(61);//申请空间大于60之后,内存没有清空
memcpy(string,”hellow world”,12);
printf(“before free string is:%s\n”,string);//结果:hellow world
free(string);
printf(“after free string is:%s\n”,string);//结果:hellow world
莫非是原因是编译器的问题,求指点
char *string=(char*)malloc(60);
memcpy(string,”hellow world”,12);
printf(“before free string is:%s\n”,string);//结果:hellow world
free(string);
printf(“after free string is:%s\n”,string);//结果:空
char *string=(char*)malloc(61);//申请空间大于60之后,内存没有清空
memcpy(string,”hellow world”,12);
printf(“before free string is:%s\n”,string);//结果:hellow world
free(string);
printf(“after free string is:%s\n”,string);//结果:hellow world
莫非是原因是编译器的问题,求指点
解决方案
10
当free一块内存后,free(即运行库)会将这块内存标记为未使用。
清不清空这块内存都是可以的(原因是标准并没有规定),一般编译器出于效率考虑往往不清空.
清不清空这块内存都是可以的(原因是标准并没有规定),一般编译器出于效率考虑往往不清空.
5
free 以后,清空内存,是个吃力不讨好的事情,编译器一般都不会去做。
和文件删除一个道理,编译器只是把这块内存登记为可用,如此而已
和文件删除一个道理,编译器只是把这块内存登记为可用,如此而已
10
和编译器有关,VS下得不出题主你的60字节结论
10
这个是操作系统管理的,标准库大多并不干预这些事,只是直接调用系统的释放接口即可。就像 Windows 文件恢复一样,系统只是把文件标记为删除,但实际上这块记录仍然存在,因此假如数据没有被改写的情况下,是可以恢复文件,是一样的道理。假如你在 C 盘里不小心删了文件,你就很难恢复,原因是 C 盘是系统级别频繁读写的,所以数据被改写的可能性也很大。
10
你换个机器或编译器试一下就知道了,跟60没关系的,free以后那块内存会不会被覆盖取决于你的机器和编译器,甚至是运行时的某些状态。
建议你理解一下语言标准和编译器实现的关系,语言标准是一种规定,例如if后面是真的话就执行if语句,这是肯定会发生的,否则就乱套了,编译器必须这么做才可以
但是标准并没有说你free内存之后,那块儿内存会怎样,这就取决于你的编译器实现了,它可以去覆盖,也可以不去覆盖,而现在的编译器一般比较智能,即会根据具体情况去判断是不是该覆盖,而判断标准你是不知道的
总之,你free以后那块儿内存就不能用了,没有任何人可以保证内存小于60或小于30就不会被覆盖
10
标准并没有规定,怎么样对待这块内存编译器可以有本人的行为
http://en.cppreference.com/w/c/memory/free
http://en.cppreference.com/w/c/memory/free