【发布时间】: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 函数向我的同事演示泄漏了多少内存?