查找地址所属的堆?

时间:2016-05-13 09:09:45

标签: c++ windows memory memory-management heap

我正在创建一个内存管理系统,我需要一种方法来查找我在哪个堆中进行分配。 例如,我使用HeapAlloc并使用GetProcessHeap()返回的堆作为要分配的堆,我希望它分配给该堆,但看起来好像它没有。

当我使用GetProcessHeaps来运行堆时,我发现进程堆大概是0x00670000,而我分配的地址是0x0243a385之类的东西。 (换句话说,它附近) 有时它实际上可能在它之前(如0x004335ab或其他东西)

所以,我想知道是否有一种方法可以可靠地获取堆的起始地址(以及最终地址,如果可能的话!?)我进行了分配。

1 个答案:

答案 0 :(得分:2)

你对堆的理解是错误的。一般来说,现代堆不依赖于分配大量数据,然后按照您的假设将其分配给每个分配(尽管他们可能将此作为其策略之一)。这意味着没有明确定义的开始'或者'结束'一堆例如,默认情况下,使用Windows堆大量分配总是通过VirtualAlloc(...)直接进入操作系统,这意味着来自一个堆的分配可能与来自另一个堆的分配交错。

如果你真的需要弄清楚分配来自哪个堆,有一种方法,虽然它真的很慢,所以除了调试或记录或类似之外你不应该依赖它。对于实际的,正常的代码,您应该知道分配来自于推导的上下文或实际存储它。

除了警告之外,您可以使用HeapWalk枚举每个堆中寻找所需分配的所有分配。