【问题标题】:Memory leak, does window have a safeguard to prevent max memory reached?内存泄漏,窗口是否有防止达到最大内存的保护措施?
【发布时间】:2013-11-23 13:07:08
【问题描述】:

我有一个使用 3rd 方 API 的应用程序,我认为它们存在内存泄漏问题。我编写了一个小测试程序(如下)来测试这一点,请注意,VMIListener 和 VMI 都来自我在其中实现其虚拟接口方法的 API。

如果我注释掉 VMI vmi,我没有任何内存泄漏行为;在我的 VMITest 课下。由于我对 C++ 的了解有限,我认为这是因为虚拟 VMI 类没有虚拟析构函数。

但是,我的问题是,window 是否有一些保护措施可以最大限度地防止内存泄漏?因为我在 Window 任务管理器中看到了一个有趣的结果。

如果我运行我的测试程序,它会自动跳跃大约 2 Gigs 并停留在那里(第一个白色圆圈区域)。如果我运行我的实际应用程序(第二个白色区域),泄漏会慢慢达到大约相同的水平(5.8 Gig),并且在这两种情况下它们都会停在那里而不会进一步增加内存。我运行了其他几个测试,让我的应用程序运行,当它们达到这个特定的内存使用水平时,泄漏就会停止。

void main(int cArgs, char* saArgs[])
{
     VMITest    *m_pVMI;

     while(true)
     {
         m_pVMI = new VMITest();
         delete m_pVMI;
         m_pVMI = NULL;
     }
 }


 class VMITest : public VMIListener
 {

    public:
           VMI  vmi;
           VMITest();

    // VMIListener interface methods.
 };

 class VMI_API VMI
 {
   public:
         VMI();
   //some more functions
 }

【问题讨论】:

  • 这是 32 位应用程序吗?请记住,默认情况下,32 位 Windows 应用程序只能分配 2GB 内存。
  • 使用一些内存泄漏检测器(如Purifyvalgrind 等...)
  • 你说得有道理,drescherjm,我用的是 64 位 macine,但应用程序在 Win32 平台上运行调试模式。

标签: c++ memory memory-management memory-leaks


【解决方案1】:

Windows 32 位应用程序的默认地址空间为 2GB,即使在 64 位 Windows 操作系统上也是如此。分配超过地址空间的内存将失败。

可以使用 /LARGEADDRESSAWARE 链接器选项将此限制扩展到 32 位窗口上的 3GB 或 64 位窗口上的 4GB。

【讨论】:

  • 多年来,我不得不使用 /LARGEADDRESSAWARE 选项,以便我能够以高分辨率处理肺部 CT 病例,以进行日常工作中的医学影像研究工作。现在每个人都有 64 位机器,我很少将应用程序构建为 32 位。
【解决方案2】:

内存使用限制取决于您的应用程序和平台,详情请查看MSDN article

我认为您的应用程序需要一个内存泄漏检测工具,DebugDiag 在 Windows 上是一个不错的选择,而且它是免费的。

【讨论】:

    猜你喜欢
    • 2010-09-21
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-10
    • 2011-12-05
    相关资源
    最近更新 更多