同事将 32 位 C++ 应用程序转换为 64 位。出于测试目的,现在的想法是指示堆管理器仅返回 64 位范围内的地址。
在互联网上搜索解决方案似乎并没有给出非常可靠的结果:
MSDN 论坛建议
VirtualAlloc()
在 CRT 初始化之前使用。但是,我不明白为什么不应该已经返回指向高地址的指针,而将底部的 4 GB 留空。Raymond Chen 说,Windows 7 有一个开关
AllocationPreference
,可以设置为MEM_TOP_DOWN
. 但是,这适用于整个系统,因此需要重新启动,这很不方便。(也在MSDN 上进行了描述)。
我在应用程序验证器中进行了挖掘,并在Heaps条目的属性中发现了一些有趣的选项:
如您所见,我已经修改了 SizeStart和SizeEnd以及AddrStart和AddrEnd。
很遗憾,
- 这些文本框不接受 64 位地址
- 这些设置似乎没有效果
虽然地址高于输入的值,但堆的大小没有改变:
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
-------------------------------------------------------------------------------------
这些应用程序验证器设置是否仍然有效?如何成功应用它们?