c++ - 查找地址属于哪个堆?

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

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

当我使用 GetProcessHeaps 遍历堆时,我发现进程堆位于 0x00670000 之类的位置,而我分配的地址位于 0x0243a385 之类的位置。 (换句话说,离它不远) 有时它实际上可以在它之前(比如 0x004335ab 之类的)

所以,我想知道是否有一种方法可以可靠地获取我在其中进行分配的堆的起始地址(如果可能的话,还有结束地址!?)。

最佳答案

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

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

抛开警告,您可以使用 HeapWalk枚举每个堆中的所有分配以查找您想要的分配。

关于c++ - 查找地址属于哪个堆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37205839/

相关文章:

linux - 从 Linux 到 Windows 的 ssh - 为什么路径中需要这么多斜杠?

sql-server - Enter-PSSession 后 Invoke-SqlCmd 出现 'NT AUTHORITY\ANONYMOUS LOGON' 错误?

c# - 为什么我超出了内存限制? C#

c++ - 使用统一初始化构造对象的简单程序编译失败

c++ - curl 多接口(interface)不起作用

python - 如何从给定的文件夹列表中找到 “{game}.exe”?

java - 定义一个巨大的全局 ImmutableList 常量的优雅方式(超出堆栈大小限制)

c++ - QFileDialog内存泄漏?

C++ vector 运算符+/-,去重

c++ - 访问结构成员问题