_嵌入式开发_

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  63 随笔 :: 22 文章 :: 1 评论 :: 47196 阅读
< 2025年6月 >
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 1 2 3 4 5
6 7 8 9 10 11 12

在某些情况下,如下代码

char *str =(char *) malloc(100);
if(str!=NULL) {
  
strcpy(str, "hello");
free(str);
}
printf(str);

可能会打印出hello。(不推荐这么做,这里只是说明问题。)

free到底释放的是什么?

解释一:

C标准没有规定free掉的数据应该是什么。只是说:free掉的内存不要再用。free只是告诉系统,这块内存我不要了,你可以再分配给别人用。系统不一定立即修改里面的内容(取决于编译器和操作系统)。

解释二:

只是把这块(内存)还给操作系统让,别的程序可以malloc到,但你有指向他的地址,所以你还是可以访问到他的。

解释三:

free()释放的是指针指向的内存!注意!释放的是内存,不是指针!指针并没有被释放,指针仍然指向原来的存储空间。指针是一个变量,只有程序结束时才被销毁。释放了内存空间后,原来指向这块空间的指针还是存在!只不过现在指针指向的内容的垃圾,是未定义的,所以说是垃圾。因此,释放内存后把指针指向NULL,防止指针在后面不小心又被解引用了。

个人总结:

free() 释放的是内存,将内存交给操作系统(内存的内容通常不释放),但是程序中指向这段内存的指针没有释放,需要自己手动将指针置为空。

真确做法是:

char *str =(char *) malloc(100);
if(str!=NULL) {
  strcpy(str, "hello"); 
      free(str);
      str=NULL;
} 

 

 

posted on 2012-04-12 16:32  _嵌入式开发_  阅读(369)  评论(0)    收藏  举报
编辑推荐:
· 协程本质是函数加状态机——零基础深入浅出 C++20 协程
· 编码之道,道心破碎。
· 记一次 .NET 某发证机系统 崩溃分析
· 微服务架构学习与思考:SOA架构与微服务架构对比分析
· tomcat为什么假死了
阅读排行:
· 知名开源项目Alist被收购!惹程序员众怒,开团炮轰甲方
· 突发,小红书开发者后门被破解?!
· 历时半年,我将一个大型asp.net的零代码快速开发平台转成了java
· [原创]《C#高级GDI+实战:从零开发一个流程图》第03章:画一个线,连接两个矩形!
· C# 将 CSV 转化为 Excel
点击右上角即可分享
微信分享提示