测试发现malloc申请空间超过60字节,free之后,内存的内容不会清除,,这是为什么

C语言 码拜 8年前 (2016-04-08) 1905次浏览
代码:
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

引用:
Quote: 引用:

释放后再 输出是未定义行为,跟60没啥关系

内存回收后指针还是指向原申请空间首址,回收后内存不会清除,按道理应该打印原字符串,
但为什么申请60字节以下,输出就是空,申请60字节以上输出就还是原来字符串,这一点还是不理解..

你换个机器或编译器试一下就知道了,跟60没关系的,free以后那块内存会不会被覆盖取决于你的机器和编译器,甚至是运行时的某些状态。
建议你理解一下语言标准和编译器实现的关系,语言标准是一种规定,例如if后面是真的话就执行if语句,这是肯定会发生的,否则就乱套了,编译器必须这么做才可以
但是标准并没有说你free内存之后,那块儿内存会怎样,这就取决于你的编译器实现了,它可以去覆盖,也可以不去覆盖,而现在的编译器一般比较智能,即会根据具体情况去判断是不是该覆盖,而判断标准你是不知道的
总之,你free以后那块儿内存就不能用了,没有任何人可以保证内存小于60或小于30就不会被覆盖

10

标准并没有规定,怎么样对待这块内存编译器可以有本人的行为
http://en.cppreference.com/w/c/memory/free

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明测试发现malloc申请空间超过60字节,free之后,内存的内容不会清除,,这是为什么
喜欢 (0)
[1034331897@qq.com]
分享 (0)