查找地址属于哪个堆
Find which heap an address belongs to?
我正在创建一个内存管理系统,我需要一种方法来找到我所做的分配在哪个堆中。例如,我使用HeapAlloc,并使用GetProcessHeap()返回的堆作为要分配给的堆。我希望它分配给那个堆,但看起来好像没有。
当我使用GetProcessHeaps运行堆时,我发现进程堆的位置大约是0x00670000,而我分配的地址大约是0x0243a385。(换句话说,离它很远)有时它实际上可能在它之前(比如0x004335ab之类的)
因此,我想知道是否有一种方法可以可靠地获得我在.
您对堆的理解是错误的。一般来说,现代堆不依赖于分配一大块数据,然后按照你的假设将其与每次分配进行分组(尽管他们可能会将其作为策略之一)。这意味着堆没有定义好的"开始"或"结束"。例如,默认情况下,对于Windows堆,大的分配总是通过VirtualAlloc(...)
直接到达操作系统,这意味着来自一个堆的分配可能会与来自另一堆的分配交错。
如果你真的需要弄清楚分配来自哪个堆,有一种方法,尽管它真的很慢,所以除了调试或日志记录或类似的事情之外,你不应该依赖它。对于实际的、正常的代码,您应该真正通过推导的上下文或实际存储来了解分配的来源
除了警告之外,您还可以使用HeapWalk枚举每个堆中的所有分配,以查找所需的分配。
相关文章:
- 将数组的地址分配给变量并删除
- 空基优化子对象的地址
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 如何在c++程序中找到函数的地址
- 异常属于C++中的线程还是进程
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 被解释为低级别const的const对象的地址
- 将地址分配给本地指针后,公共对象的变量将消失
- 为什么我在leetcode上收到AddressSanitizer:地址0x602000000058上的堆缓冲区溢出错误
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- 内联程序集printf将整数解释为地址
- 为什么指针不写入类的地址?
- 如何在C++中获取该对象的类声明中对象的地址?
- 通过按地址访问变量
- 当一个新对象被分配到它的地址时,对象是否必须被销毁
- 函数名是c中该函数的第一条指令的地址吗
- 如何使用C或C 查找给定的IPv6地址是否属于CIDR范围
- 查找地址属于哪个堆
- 进程如何访问不属于其虚拟地址空间的内存映射 IO 地址?