WIN32内存问题(调试/发布之间的差异) 我目前正在使用一个遗留的应用程序(Win32,Visual C++ 2005),使用LoalAlLoC分配内存(在提供的库中我不能改变)。该应用程序在固定内存中保持非常大的状态(一开始通过多次调用LocalAlloc(LPTR,size)创建)。我注意到,在发布模式下,我的内存约为1.8gb,但在调试模式下,我的内存将超过3.8gb。我正在使用/3gb开关运行XP64。我需要增加应用程序中使用的内存,我在发布时达到了内存限制(调试正常)。有什么想法吗?

WIN32内存问题(调试/发布之间的差异) 我目前正在使用一个遗留的应用程序(Win32,Visual C++ 2005),使用LoalAlLoC分配内存(在提供的库中我不能改变)。该应用程序在固定内存中保持非常大的状态(一开始通过多次调用LocalAlloc(LPTR,size)创建)。我注意到,在发布模式下,我的内存约为1.8gb,但在调试模式下,我的内存将超过3.8gb。我正在使用/3gb开关运行XP64。我需要增加应用程序中使用的内存,我在发布时达到了内存限制(调试正常)。有什么想法吗?,c++,c,winapi,C++,C,Winapi,听起来您的发布版本也编译为x86。若并没有,那个么你们的代码中一定有什么东西将指针视为有符号的32位整数,而这段代码只在发行版中有效 内存不足是如何表现出来的 此外,在运行64位应用程序时,没有理由对XP64使用/3gb标志:在这种情况下,它不会改变任何东西。一个建议是:查看在发布和调试模式下加载到进程空间的DLL的基址,看看是否有很大的差异。在发行版的情况下,可能在地址处加载了DLL,因此,虽然总共有足够的可用空间来支持LocalAlloc()调用,但没有足够的连续地址空间来满足它。(对于一个

听起来您的发布版本也编译为x86。若并没有,那个么你们的代码中一定有什么东西将指针视为有符号的32位整数,而这段代码只在发行版中有效

内存不足是如何表现出来的


此外,在运行64位应用程序时,没有理由对XP64使用/3gb标志:在这种情况下,它不会改变任何东西。一个建议是:查看在发布和调试模式下加载到进程空间的DLL的基址,看看是否有很大的差异。在发行版的情况下,可能在地址处加载了DLL,因此,虽然总共有足够的可用空间来支持LocalAlloc()调用,但没有足够的连续地址空间来满足它。(对于一个人为的例子,假设有一个DLL加载在0x40000000(1Gb),另一个加载在0x8000000(2Gb),另一个加载在0xC0000000(3Gb)。即使这些DLL非常小,进程一次也不能分配超过1Gb的空间,因为没有足够大的连续可用地址块)


如果在调试和发布过程中内存分配的顺序也不同,您也可能会遇到此问题。

您可能有与/LARGEADDRESSAWARE链接的调试配置和与/LARGEADDRESSAWARE链接的发布配置:否(或完全缺失)


选中链接器->系统->在项目的配置属性中启用大地址。

好的,我假设它是一个64位的应用程序,因为你得到了3.8Gb。是的,你说得对,这可以在32位64位操作系统下完成。那么,内存耗尽是如何表现出来的呢?我建议先查看一下,通过调用LocalAlloc返回NULL来显示内存不足……:-)我意识到我可能需要将应用升级到64位才能访问更大的固定内存。但是,我需要知道限制,以便说服我的老板这是唯一的方法,因此我需要做出决定:a)找出如何分配多一点内存(约100mb)。工作完成-或-b)证明升级到64位是合理的,并让其他团队更新他们的库。