查找地址属于哪个堆?
Find which heap an address belongs to?
我正在创建一个内存管理系统,我需要一种方法来找到我在哪个堆中进行分配。
例如,我使用 HeapAlloc 并使用 GetProcessHeap() 返回的堆作为要分配给的堆我希望它分配给那个堆,但看起来好像没有。
当我使用 GetProcessHeaps 运行 通过堆时,我发现进程堆位于 0x00670000 之类的位置,而我分配的地址位于 0x0243a385 之类的位置。 (换句话说,离它不远)
有时它实际上可以在它之前(比如 0x004335ab 之类的)
所以,我想知道是否有一种方法可以可靠地获取我在其中进行分配的堆的起始地址(如果可能的话还有结束地址!?)。
你对堆的理解是错误的。通常,现代堆不依赖于分配大量数据,然后像您假设的那样将其与每次分配一起打包(尽管他们可能将此作为其策略之一)。这意味着没有明确定义的 'start' 或 'end' 堆。例如,默认情况下,对于 Windows 堆,大分配总是通过 VirtualAlloc(...)
直接进入操作系统,这意味着来自一个堆的分配可能与来自另一堆的分配交错。
如果您真的需要弄清楚分配来自哪个堆,有一种方法,尽管它真的很慢,所以除了调试或日志记录或类似的情况外,您不应该依赖它。对于实际的、正常的代码,您真的应该知道分配来自何处,通过推导上下文或实际存储它。
撇开警告不谈,您可以使用 HeapWalk 枚举每个堆中的所有分配以查找您想要的分配。
我正在创建一个内存管理系统,我需要一种方法来找到我在哪个堆中进行分配。 例如,我使用 HeapAlloc 并使用 GetProcessHeap() 返回的堆作为要分配给的堆我希望它分配给那个堆,但看起来好像没有。
当我使用 GetProcessHeaps 运行 通过堆时,我发现进程堆位于 0x00670000 之类的位置,而我分配的地址位于 0x0243a385 之类的位置。 (换句话说,离它不远) 有时它实际上可以在它之前(比如 0x004335ab 之类的)
所以,我想知道是否有一种方法可以可靠地获取我在其中进行分配的堆的起始地址(如果可能的话还有结束地址!?)。
你对堆的理解是错误的。通常,现代堆不依赖于分配大量数据,然后像您假设的那样将其与每次分配一起打包(尽管他们可能将此作为其策略之一)。这意味着没有明确定义的 'start' 或 'end' 堆。例如,默认情况下,对于 Windows 堆,大分配总是通过 VirtualAlloc(...)
直接进入操作系统,这意味着来自一个堆的分配可能与来自另一堆的分配交错。
如果您真的需要弄清楚分配来自哪个堆,有一种方法,尽管它真的很慢,所以除了调试或日志记录或类似的情况外,您不应该依赖它。对于实际的、正常的代码,您真的应该知道分配来自何处,通过推导上下文或实际存储它。
撇开警告不谈,您可以使用 HeapWalk 枚举每个堆中的所有分配以查找您想要的分配。