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

时间:2010-02-13 11:41:51

标签: c memory-management

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

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

4 个答案:

答案 0 :(得分:13)

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

答案 1 :(得分:5)

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

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

OS如何检测到双重免费?机制是什么?

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

但是,如果该块已经被重新分配,它会找到它并正确地释放它=>但是现在使用重新分配的块的代码将变得疯狂,因为它正确获取的内存以及它未释放的内存已经变得无法分配。

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

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

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

答案 2 :(得分:3)

不,没有MMU机制来检测它。通常在已经释放的地址上调用free会导致程序崩溃,因为free的实现会发生意外情况并导致分段错误。

运行valgrind是检查内存管理问题的好方法,例如双重释放指针。

答案 3 :(得分:1)

将其设置为NULL实际上不是一个好习惯,它隐藏了错误。特别是双免费()s。检查操作系统内存映射,如0xfeeefeee或0xdeadbeef通常是好的。

您可以使用调试分配器诊断double free()。大多数体面的CRT都有一个。

相关问题