2014-01-15 48 views
-2

好吧,众所周知GlobalAlloc/GlobalFree/HeapAlloc/HeapFree API正在管理默认堆或用户定义堆(CreateHeap),每个堆有一些段,每个段都有多个块。它被称为The Freelist而后备列表正在管理每个堆中的空闲块。VirtualAlloc/VirtualFree vs Heap函数

在扭转一块软件,我发现使用VirtualAlloc分配一大块内存。基本上我不能说它是一个堆,因为这个块是直接从虚拟地址空间分配的,并没有显示任何堆的迹象。 但是应用程序中的一些例程将设置自定义Freelist,该应用程序本身由应用程序管理,并用于定义和控制使用VirtualAlloc分配的大块的空闲部分。

作为应用程序设置了一个Freelist结构来管理它,我可以称这个块为HEAP吗?

+3

如果你愿意,你可以称它为香蕉。你真的想知道什么? –

+0

我实际上正在破坏该块并覆盖应用程序设置的flink/blink指针,我想写一篇关于它的文章,并且我很害怕将这个分配的块称为堆而被误认为是!因为它不是,它只是应用程序编辑的VAS中的一大块内存,所以它只能获得堆的小特性! – JohnnyCat

+0

所以你回答了你自己的问题,这不是一堆。 – Damon

回答

1

VirtualAlloc可成功使用来实现自定义内存管理器。我想这是你的代码可能做的。它可能使用VirtualAlloc来保留连续的大地址空间,但它最初不会提交它,这意味着没有从系统中检索物理内存。空闲列表可能指向这些未提交的地址空间。

VirtualAlloc实际上处于内存管理的最低级别,malloc库可能实际上是用它来实现的。

+0

实际上,freelist将指向已提交的空间,因为它指向的块已被提交然后分配。释放后,应用程序将通过在该内存部分内设置2个指针并编辑主freelist flink并闪烁来将其添加到freelist。所以这实际上是一个承诺的内存区域,只要大块的一部分被分配或释放,就会被访问。未提交区域是那些在没有提交的部分可用于分配时将被提交的区域,并且这些检查全部由应用程序完成。 – JohnnyCat