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

北漂的猪
  • 34

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

回复
阅读 9.5k
2 个回答
✓ 已被采纳

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

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

宣传栏