MMU如何检测指针的双重释放?

Sri*_*nth 4 c memory-management

内存管理单元(MMU)如何检测指针的双重释放?

我知道在释放指针之后将指针设为NULL是一个很好的做法,但假设程序员不这样做.是否有任何MMU机制来检测它?

小智 13

MMU与它无关.如果释放分配了malloc两次的指针,则可能会损坏C运行时堆.堆(而不是MMU)原则上可以保护自己免受此类事情的影响,但大多数情况下并非如此.请注意,这与操作系统无关 - malloc()和free()都不是系统调用.


Mat*_*lia 5

内存管理单元(MMU)如何检测指针的双重释放?

MMU只执行虚拟地址空间 - >物理内存映射,它不知道堆如何组织/分配如何工作/ ...,即操作系统/分配器工作.

操作系统如何检测到双重免费?机制是什么?

它遍历已分配块的列表/位图/ ...,看到没有分配的块与您传递给它的地址,因此它检测到它是双重释放.

但是,如果已经重新分配了该块,它会找到它并正确地释放它=>但是现在使用重新分配的块的代码将变得疯狂,因为它正确获取的内存并且它没有释放变得没有分配.

如果分配器保护未分配的内存,将其标记为无读取和不写入/从虚拟地址空间的已提交页面中删除它,程序将在再次访问该内存时立即死亡(但显然导致崩溃的代码)实际上是无辜的,因为它没有做错任何事).

否则,应用程序可能仍会工作一段时间,直到该内存块将被提供给请求某些内存的其他代码段.此时,同一个应用程序的两个部分将尝试在同一块内存上工作,所有可能源于此的混乱.

(感谢Pascal Cuoq指出我的错误.)