WIN32内存问题(调试/发布之间的差异)

时间:2009-06-04 11:24:11

标签: c++ c winapi

我目前正在开发一个遗留应用程序(win32,Visual C ++ 2005),它使用LocalAlloc分配内存(在提供的库中我无法更改)。应用程序在固定内存中保持非常大的状态(在开始时创建多次调用LocalAlloc(LPTR,大小))。我注意到在发布模式下,我的内存耗尽大约1.8gb,但在调试中它很快就会超过3.8gb。我用/ 3gb开关运行XP64。我需要增加应用程序中使用的内存,并且我在发布时遇到内存限制(调试工作正常)。有什么想法吗?

3 个答案:

答案 0 :(得分:4)

你可能有与/ LARGEADDRESSAWARE链接的Debug配置和与/ LARGEADDRESSAWARE链接的Release配置:NO(或完全缺失)。

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

答案 1 :(得分:1)

听起来你的Release版本也编译为x86。如果没有,那么代码中必须有一些东西将指针视为带符号的32位整数,并且此代码仅在Release中有效。

内存耗尽如何显现?

此外,在运行64位应用程序时没有理由为XP64使用/ 3gb标志:在这种情况下它不会改变任何内容

答案 2 :(得分:0)

一个建议:查看在发布和调试模式下加载到进程空间的DLL的基地址,看看是否存在很大差异。在发布的情况下,可能会在地址处加载DLL,这样,虽然总共有足够的可用空间来支持LocalAlloc()调用,但是没有足够的连续地址空间来满足它。 (对于一个人为的例子,假设有一个DLL加载在0x40000000(1Gb),另一个加载在0x80000000(2Gb),另一个加载在0xC0000000(3Gb)。即使这些DLL真的很小,这个过程也不能分配超过一次1Gb,因为没有连续的地址空间块可以保留足够的空间。

如果内存分配在调试和发布中以不同的顺序发生,您也可以获得此问题的变体。