如何查找Windows上所有程序堆的列表? 试图在C++测试程序中尝试栈和堆分配时,我首先惊讶地发现Windows不一定将堆栈置于高地址,堆在低地址。在深入挖掘时,我进一步惊讶地发现它维护了几个堆,有关这些堆的详细信息可以通过编程方式确定,如图所示。所以我现在在我的测试程序中(在Win10、x86-64、mingw73_64上):

如何查找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的
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