对一段内存调用free()函数后发生了什么?

发布于 2022-08-23 20:55:32 字数 123 浏览 23 评论 2

C/C++中在对一个指针指向的内存调用free函数后,指针的值不变。那么这个指针指向的内存的值变不变呢?系统如何标记这段内存已经不再使用可以重新分配了呢?malloc free new delete操作在操作系统级别上发生了什么呢?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

妄断弥空 2022-08-27 05:15:29

在使用free()以后,指针的值没有变,但是指针所指向的地址的内容已经被标记为不可以使用,留作重新分配使用。
使用malloc的时候,实际系统只是记录了你申请的空间大小,但没有真的分配足够的空间,当你真的使用这段申请的指针地址时,操作系统会产生一个错误,标示现在有需要申请一段可用的内存了
new实际是在malloc的基础上申请了空间,并且初始化了这段空间,因此系统将这段内存已经实际创建完成了
delete不太清楚

最偏执的依靠 2022-08-27 03:50:22

你看看这篇文章里的比喻就知道你释放一段内存以后再去读取这段内存的后果了
http://coolshell.cn/articles/4907.htm...
文章里面写的情况是去操作一个已经超过作用域的栈上面的数组,和你操作一段已经free掉的堆数据是一样的道理
其实你如果自己去尝试写一个内存池的模块就对free操作有个清晰的了解了
一般来说是这样,你申请一段内存,操作系统实际上会申请一段比你申请的内存稍微大一点的一段内存,而多出来这部分是用来存放一个结构体
|结构体|用户使用的内存|
这个结构体里记录了一些信息用来给操作系统去维护这段内存
当你释放的时候,free函数会把你传入的指针往前移,指向这个结构体,然后把这个结构体的标志位改一下,表示这段内存已经释放了,就这么多。
下次操作系统遍历内存池的时候就知道这段内存已经没人使用了,会对这段内存进行回收、合并、重分配等操作。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文