【问题标题】:VS2008|: Memory use discrepancy between Task Manager and CRT Heap Debugger functionsVS2008|:任务管理器和 CRT 堆调试器功能之间的内存使用差异
【发布时间】:2013-05-27 11:44:37
【问题描述】:

我一直在使用各种 _CRTMem* 函数来尝试定位我们代码中的内存泄漏。该应用程序是非托管 C++ 应用程序。我注意到一些奇怪的事情:

  • 任务管理器报告的内存使用增加(我使用其“提交大小”指标)与使用 CRT 堆调试器函数 _CrtMemCheckpoint()、_CrtMemDifference() 和 _CrtMemDumpStatistics() 报告的内存使用增加之间存在巨大差异.报告的内存使用增加为 200KB(任务管理器)与 17KB(CRT 堆调试器)。难道是windows在后台分配了额外的内存?这似乎是一个巨大的差异。
  • 我一直在使用 _CRTDBG_MAP_ALLOC #define 和函数 _CrtMemDumpAllObjectsSince() 来获取内存泄漏文件的位置。但是,大约 75% 的泄漏没有可用的文件位置信息。这是否也表明在幕后发生了额外的分配。

我们使用 Windows 7 进行测试,但最终目标应用程序将在 Windows CE 下运行。 WindowsCE 是否有更好(或不同)的内存管理?

有人可以帮忙吗? 非常感谢, 保罗

【问题讨论】:

  • 任务管理器报告 Windows 为应用程序保留的内存,而不是应用程序实际分配的内存。
  • 这里的第一条规则是永远不要使用任务管理器来诊断/调试内存泄漏。
  • 除了堆之外还有很多提交源。 (例如,VirtualAlloc 创建提交。)您使用的 CRT 函数只计算分配的堆。空闲堆仍然被提交。
  • 感谢您的回复。所以我使用 CRT 函数向我的同事演示泄漏了多少内存?

标签: c++ windows memory


【解决方案1】:

任务管理器曾经向您显示真实数字,但自从 Vista(我认为)他们更改了它,因此它会报告“简化”报告。这对于严肃的工作毫无用处,即使非技术用户足以了解他们系统中发生的事情。

an article 描述了一些更改。

如果您想测量内存,请使用 perfmon、多个内存计数器之一或进程对象的内存计数器。这些将为您提供所需的原始数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    • 1970-01-01
    相关资源
    最近更新 更多