我正在创建一个内存管理系统,我需要一种方法来查找我在哪个堆中进行的分配。
例如,我使用HeapAlloc并使用GetProcessHeap()返回的堆作为要分配给的堆,我希望它可以分配给该堆,但看起来好像没有。
当我使用GetProcessHeaps运行堆时,我发现进程堆位于0x00670000之类,而我分配的地址位于0x0243a385之类。 (换句话说,离它不远)
有时它实际上可以在它之前(例如0x004335ab之类)
因此,我想知道是否有一种方法可以可靠地获取我在其中进行分配的堆的起始地址(如果可能的话,还有结束地址!?)。
最佳答案
您对堆的理解是错误的。通常,现代堆不依赖于分配大量数据,而是按照您的假设将其与每个分配一起拆分(尽管它们可以将其用作其策略之一)。这意味着没有明确定义的堆的“开始”或“结束”。例如,默认情况下,在Windows堆中,大型分配总是始终通过VirtualAlloc(...)
直接进入操作系统,这意味着来自一个堆的分配可能与来自另一个堆的分配交错。
如果您确实需要确定分配来自哪个堆,则有一种方法,尽管它确实很慢,所以除了调试,记录或类似操作外,您不应该依赖它。对于实际的普通代码,您应该真正知道分配的来源是通过推论上下文还是通过实际存储分配。
除了警告,您可以使用HeapWalk枚举每个堆中的所有分配以查找所需的分配。