【问题标题】:WIN32 memory issue (differences between debug/release)WIN32 内存问题(调试/发布之间的差异)
【发布时间】:2009-06-04 11:24:10
【问题描述】:

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

【问题讨论】:

  • 我意识到我可能必须将应用程序升级到 64 位才能访问更多的固定内存。但是我需要知道限制,以便让我的老板相信这是唯一的方法,所以我需要做出决定:a)弄清楚如何分配更多的内存(大约 100mb)。工作完成 - 或 - b) 证明升级到 64 位并让其他团队更新他们的库。

标签: c++ c winapi


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    内存不足的表现如何?

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

    【讨论】:

    • 好吧,我假设它是一个 64 位应用程序,因为您获得了 3.8Gb。是的,你是对的,这可以在 64 位操作系统下的 32 位操作系统中完成。那么内存不足是如何表现出来的呢?我建议先看看那里
    • 内存不足表明调用 LocalAlloc 返回 NULL.... :-)
    【解决方案3】:

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

    如果内存分配在调试和释放中也以不同的顺序发生,您也可以得到这个问题的变体。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-15
      • 2010-10-09
      • 2011-02-04
      • 1970-01-01
      • 2013-08-06
      • 2012-08-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多