查找地址属于哪个堆

Find which heap an address belongs to?

本文关键字:属于 地址 查找      更新时间:2023-10-16

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

当我使用GetProcessHeaps运行堆时,我发现进程堆的位置大约是0x00670000,而我分配的地址大约是0x0243a385。(换句话说,离它很远)有时它实际上可能在它之前(比如0x004335ab之类的)

因此,我想知道是否有一种方法可以可靠地获得我在.

中进行分配的堆的起始地址(以及结束地址,如果可能的话!?)

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

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

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