强制堆分配超过 4 GB

Tho*_*ler 5 c++ windows 64-bit application-verifier

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

\n\n

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

\n\n\n\n

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

\n\n

应用验证器

\n\n

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

\n\n

很遗憾,

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

虽然地址高于输入的值,但堆的大小并未更改:

\n\n
Termination on corruption : ENABLED\n          Heap     Flags   Reserv  Commit  Virt   Free  List   UCR  Virt  Lock  Fast \n                            (k)     (k)    (k)     (k) length      blocks cont. heap \n-------------------------------------------------------------------------------------\n000001e0aa590000 00000002    2040   1528   2040      3     1     2    0      0      \n000001e0aa440000 00001002    1080    248   1080      2     2     2    0      0      \n000001e0aa410000 00008000      64      4     64      2     1     1    0      0      \n000001e0aa520000 00001002    1080    104   1080      1     2     2    0      0      \n000001e0af2f0000 00001002      60     60     60      6     1     1    0      0      \n-------------------------------------------------------------------------------------\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n

Tho*_*ler 0

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

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