Windows任务管理器确定程序的内存使用情况有多可靠?

时间:2011-04-20 17:11:20

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

我可以使用任务管理器来检测巨大的内存泄漏吗?我有一个小文本解析程序,当我启动它时显示大约640K的内存使用量。当我解析文件并将其编入索引时,内存使用量会根据文件的大小而增加。然后当我“清除”索引时,我的内存使用率下降到1400K左右。在此之后,我可以添加任意数量的文件,当我清除索引时,内存使用率下降到1400k级别或者~~~5%。

这是在我改变程序之后。在更改之前,每次我索引一些文件然后清除时,内存使用量将继续增加。因此,经过多次清理后,我的程序的内存使用量不断增长。

我意识到这可能是一种“hackish”方式来描述我的应用程序,但我是一名学生,我所能找到的是商业性能分析工具,这是遥不可及的。我也读过关于valgrind的内容,这只是linux而且我正在开发Windows。完全使用任务管理器还是我被误导了?

2 个答案:

答案 0 :(得分:7)

对于这个目的,TaskMgr太粗糙了。特别是如果你有很多动态分配和解除分配会导致高度分散的堆内存,在这种情况下,由于碎片,很难区分泄漏和堆的自然增长。您应该使用win32 API调用来检查应用程序分配的内存总量。几年前,当我以前仍然遇到内存泄漏问题时(由于RAII而没有那些),我曾经在main()的开头放了一小段代码来查询总量在堆上分配的内存块,然后在main()函数的最后再次查询它,如果这两个值不匹配,我会报告此时“X字节的内存泄漏”错误。

如果您想这样做,可以使用GlobalMemoryStatuxExHeapWalk。前者使用起来更简单,速度更快,但更粗糙,而后者更精确,但更广泛。

答案 1 :(得分:5)

TaskMgr是一个非常粗糙的工具,但它仍然很有用。如果你在1兆字节范围内有内存泄漏,那么告诉你拥有它们可能已经足够了。但是,最终,你会在10千字节和以下范围内寻找泄漏,而TaskMgr对那些人来说是无用的。