请问一下free是不是将标记为已使用的地址改为未使用,也就是里面的数据并未清空,只是改了下“标记”?还有个问题就是用malloc创建一个在子函数中的数组,这个数组是动态存储类型吗,是不是自动存储类型(动态与自动的关系是什么?)?它离开作用域是不是存储内容不会被清除?
1 回答
已采纳
onemoo
TA贡献883条经验 获得超454个赞
请问一下free是不是将标记为已使用的地址改为未使用,也就是里面的数据并未清空,只是改了下“标记”?
你说的这些是在猜测 free 的具体实现。 C 标准没有规定 free 具体实现应该如何,所以这个问题没有标准答案。
C 标准只是规定:
free 的参数必须是之前由库函数分配内存而来的指针,或是 null 指针
参数如果之前被 free 了,则函数的行为是未定义的
访问已被 free 的指针的行为是未定义的
当然,你的猜测也是有道理的。确实很多实现是这样的。
也许你的这些思考对你学习理解 C 语言有帮助。但是在学习和使用 C 语言时要记住:你不应该假定你的编译器会如何实现,只应该按照规定的语法规则来使用 C。
还有个问题就是用malloc创建一个在子函数中的数组,这个数组是动态存储类型吗,是不是自动存储类型(动态与自动的关系是什么?)?
是你说的“动态存储类型”的。其实就是指需要动态管理的内存(用 malloc 分配、free 释放...等)。
那当然就不是“自动存储类型”的了。你通常定义的普通变量一般都属于这种“自动类型”,这样的变量所占用的内存只在它所在的作用域中存在,离开其作用域后就会被销毁。
这两种存储类型的区别简单地说就是这样的。
所以才会强调说“手动分配的内存一定要记得 free 掉,不然就会内存泄漏”,就是因为这些所谓“动态存储类型”并不会被自动销毁。
- 1 回答
- 0 关注
- 886 浏览
添加回答
举报
0/150
提交
取消