帮助奇怪的记忆行为.寻找我的大脑和我的代码中的泄漏

bas*_*ibe 6 c++ memory debugging memory-leaks

我花了最近几天试图在我们正在开发的程序中找到内存泄漏.

首先,我尝试使用一些检漏仪.在解决了一些问题后,他们不再发现任何泄漏.但是,我也在监视我的应用程序perfmon.exe.当使用该应用程序时,性能监视器报告"私有字节"和"工作集 - 私有"正在稳步上升.对我而言,这表明程序运行的时间越长,内存越来越多.然而,内部资源似乎很稳定,所以这听起来像是泄露给我.

该程序正在运行时加载DLL.我怀疑这些泄漏或它们在该库中发生的任何泄漏,并在卸载库时被清除,因此它们不会被泄漏检测器拾取.我使用DevPartner BoundsChecker和Virtual Leak Detector来查找内存泄漏.据说两者都可以捕获DLL中的泄漏.

此外,内存消耗逐步增加,这些步骤大致但不完全一致,与我在应用程序中执行的某些GUI操作一致.如果这些是我们代码中的错误,那么每次执行操作时都会触发它们,而不是大多数时间.

每当我面对如此多的陌生感时,我就开始质疑我的基本假设.所以我转向你,谁知道一切,提出建议.我的假设有缺陷吗?您是否知道如何解决此类问题?

编辑:
我目前在Windows 7 64上使用Microsoft Visual C++(x86).

Edit2:
我刚刚使用IBM Purify来寻找泄漏.首先,它将整个程序的30%列为泄漏内存.这不可能是真的.我想它是将整个DLL识别为泄露或类似的东西.但是,如果我每隔几次操作就会搜索新的泄漏,它会报告与性能监视器报告的大小增加相对应的泄漏.这可能导致泄漏.可悲的是,我只使用Purify的试用版,因此它不会向我显示这些泄漏的实际位置.(这些泄漏仅在运行时出现.当程序退出时,任何工具都不会报告任何泄漏.)

Pup*_*ppy 3

使用 PerfMon 或任务管理器监视应用程序的内存使用情况并不是检查内存泄漏的有效方法。例如,您的运行时可能只是出于预分配目的或由于碎片而保留了操作系统的额外内存。

根据我的经验,诀窍是 CRT 调试堆。您可以请求有关所有活动对象的信息,CRT 提供了比较快照的功能。

http://msdn.microsoft.com/en-us/library/wc28wkas.aspx