首页 > 解决方案 > 强制堆分配超过 4 GB

问题描述

同事将 32 位 C++ 应用程序转换为 64 位。出于测试目的,现在的想法是指示堆管理器仅返回 64 位范围内的地址。

在互联网上搜索解决方案似乎并没有给出非常可靠的结果:

我在应用程序验证器中进行了挖掘,并在Heaps条目的属性中发现了一些有趣的选项:

应用验证者

如您所见,我已经修改了 SizeStartSizeEnd以及AddrStartAddrEnd

很遗憾,

  1. 这些文本框不接受 64 位地址
  2. 这些设置似乎没有效果

虽然地址高于输入的值,但堆的大小没有改变:

Termination on corruption : ENABLED
          Heap     Flags   Reserv  Commit  Virt   Free  List   UCR  Virt  Lock  Fast 
                            (k)     (k)    (k)     (k) length      blocks cont. heap 
-------------------------------------------------------------------------------------
000001e0aa590000 00000002    2040   1528   2040      3     1     2    0      0      
000001e0aa440000 00001002    1080    248   1080      2     2     2    0      0      
000001e0aa410000 00008000      64      4     64      2     1     1    0      0      
000001e0aa520000 00001002    1080    104   1080      1     2     2    0      0      
000001e0af2f0000 00001002      60     60     60      6     1     1    0      0      
-------------------------------------------------------------------------------------

这些应用程序验证器设置是否仍然有效?如何成功应用它们?

标签: c++windows64-bitapplication-verifier

解决方案


正如@HansPassant 在评论中提到的那样,Windows 8 分配的内存超过了 4 GB 的限制。这是因为 64 位应用程序/HIGHENTROPYVA默认使用标志编译,如Raymond Chen 的“旧新事物”博文中所述。

对于 Windows 7,想法是使用VirtualQuery()、检查MEM_FREE然后分配所有这些区域VirtualAlloc(),您可以在其中传递要分配的地址。


推荐阅读