如何查找Windows上所有程序堆的列表? 试图在C++测试程序中尝试栈和堆分配时,我首先惊讶地发现Windows不一定将堆栈置于高地址,堆在低地址。在深入挖掘时,我进一步惊讶地发现它维护了几个堆,有关这些堆的详细信息可以通过编程方式确定,如图所示。所以我现在在我的测试程序中(在Win10、x86-64、mingw73_64上):
[qDebug的如何查找Windows上所有程序堆的列表? 试图在C++测试程序中尝试栈和堆分配时,我首先惊讶地发现Windows不一定将堆栈置于高地址,堆在低地址。在深入挖掘时,我进一步惊讶地发现它维护了几个堆,有关这些堆的详细信息可以通过编程方式确定,如图所示。所以我现在在我的测试程序中(在Win10、x86-64、mingw73_64上):,c++,memory-management,win64,C++,Memory Management,Win64,[qDebug的qDebug是一个Qt函数,与当前的问题无关。]我本来希望两个分配都能从一个程序堆中完成。相反,我看到的是: Num heaps = 3 Heap 0 at address: 0x750000 - 0x777000, size 159744 bytes Heap 1 at address: 0x10000 - 0x20000, size 65536 bytes Heap 2 at address: 0x1c0000 - 0x1c8000, size 32768 bytes in
qDebug
是一个Qt函数,与当前的问题无关。]我本来希望两个分配都能从一个程序堆中完成。相反,我看到的是:
Num heaps = 3
Heap 0 at address: 0x750000 - 0x777000, size 159744 bytes
Heap 1 at address: 0x10000 - 0x20000, size 65536 bytes
Heap 2 at address: 0x1c0000 - 0x1c8000, size 32768 bytes
int array malloc addr in main() = 0x1c64b0
Foo alloc addr in main() = 0xc673920
如您所见,int数组分配是从Heap 2中完成的,但是Foo分配在左字段的某个地方。(从代码中获得堆大小。)重复运行会产生不同的地址,但结果是相似的(也看到两个分配都来自“第四堆”)。除了MS代码打印的三个堆之外,还有更多堆吗?有没有其他方法可以获得综合列表?欢迎来到Crazytown。内存管理很奇怪。我没有研究过这在操作系统级别上是如何工作的,但是如果你发现你的堆栈来自Windows称之为堆的东西,不要感到惊讶。见鬼,有时候你得到内存却发现你没有真正得到内存。操作系统在请求上打上橡皮图章,并将尽其所能在以后您实际尝试使用时提供实际的物理内存。不需要堆来占用连续内存。@user4581301我实际上也通过
SIZE\t stackObject打印了堆栈地址(尽管我的问题中没有包括堆栈地址);SIZE_T stackBottom=((SIZE_T)和stackObject)和~0xfff)代码>,例如为堆栈底部打印0x6af000
,各种堆栈变量的地址为0x6afc90
,0x6afc8c
等。因此堆栈地址看起来是一致的(并且不与堆malloc的任何地址重叠)。@RaymondChen对,但是各个堆的范围必须是连续的,对吗?我已经通过VirtualQuery()
将这些信息提取到内存\u基本信息
结构中,然后打印出mbi.RegionSize
。欢迎来到Crazytown。内存管理很奇怪。我没有研究过这在操作系统级别上是如何工作的,但是如果你发现你的堆栈来自Windows称之为堆的东西,不要感到惊讶。见鬼,有时候你得到内存却发现你没有真正得到内存。操作系统在请求上打上橡皮图章,并将尽其所能在以后您实际尝试使用时提供实际的物理内存。不需要堆来占用连续内存。@user4581301我实际上也通过SIZE\t stackObject打印了堆栈地址(尽管我的问题中没有包括堆栈地址);SIZE_T stackBottom=((SIZE_T)和stackObject)和~0xfff)代码>,例如为堆栈底部打印0x6af000
,各种堆栈变量的地址为0x6afc90
,0x6afc8c
等。因此堆栈地址看起来是一致的(并且不与堆malloc的任何地址重叠)。@RaymondChen对,但是各个堆的范围必须是连续的,对吗?我已经通过VirtualQuery()
将它们提取到内存\u基本信息
结构中,然后打印出mbi.RegionSize
。
Num heaps = 3
Heap 0 at address: 0x750000 - 0x777000, size 159744 bytes
Heap 1 at address: 0x10000 - 0x20000, size 65536 bytes
Heap 2 at address: 0x1c0000 - 0x1c8000, size 32768 bytes
int array malloc addr in main() = 0x1c64b0
Foo alloc addr in main() = 0xc673920