在某些情况下,如下代码
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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)