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

4
我可以使用任务管理器来检测大内存泄漏吗?我有一个小的文本解析程序,在启动时显示大约640K的内存使用情况。当我解析文件并索引它时,内存使用情况会根据文件大小增长。然后,当我“清除”索引时,我的内存使用量下降到约1400K左右。在此之后,我可以添加任意数量的文件,当我清除索引时,内存使用量会降至这个1400k水平上下+/-5%。
这是在我对程序进行更改之后发生的。在更改之前,每次索引一些文件然后清除后,内存使用量都会继续增加。因此,在许多清除之后,我的程序的内存使用情况不断增长。
我知道这可能是一种“hackish”(笨拙)的应用程序分析方法,但我是一名学生,我所能找到的只有商业性能分析工具,这已经超出了我的预算。我也听说过Valgrind,但它仅适用于Linux,而我正在Windows上开发。在任务管理器中使用是否准确或者我被误导了?

你看过这个吗?https://dev59.com/eXVD5IYBdhLWcg3wKYP- - uncaught_exceptions
谢谢,我在搜索中没有遇到过这个,并且里面有很好的信息。我仍然想了解使用Windows任务管理器来感知应用程序的内存使用情况以及是否存在泄漏的准确性和可行性。 - Pete
简单回答你的问题是肯定的。任务管理器足够可靠,可以告诉你进程总共占用了多少内存(从操作系统角度来看)。但它不会提供任何细节信息,也无法帮助你进行调试。在你的情况下,现在使用任务管理器似乎还可以。但这种方法不会扩展 :) - uncaught_exceptions
2个回答

7
任务管理器过于简陋,无法满足此目的。特别是如果您有大量的动态分配和取消分配,这将导致高度分段的堆内存,在这种情况下,很难区分泄漏和由于碎片化而导致的堆的自然增长。您应该使用win32 API调用来检查应用程序分配的总内存量。几年前,当我还遇到内存泄漏问题(现在由于RAII不再遇到这些问题),我会在main()函数的开头放置一小段代码,查询在堆上分配的内存块的总数,然后在main()函数的结尾再次查询,如果两个值不匹配,我会在那时报告“X字节内存泄漏”错误。
如果您想这样做,可以使用GlobalMemoryStatuxExHeapWalk。前者更简单,更快,但更粗糙,而后者更精确,但更广泛。

5

TaskMgr是一款非常简陋的工具,但它还是很有用的。如果您的内存泄漏在一兆字节范围内,那么它可能足以告诉您是否存在泄漏。但是,最终,您将需要寻找10千字节及以下范围内的泄漏,而TaskMgr对于这些是毫无用处的。


谢谢你的提示。目前我正在寻找的泄漏非常严重(几兆字节)。我正在使用集合和指针,并怀疑在堆上创建的对象根本没有被删除。尽管我相信已经放置了一些适当的删除语句,但我仍然无法找出原因。 - Pete

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接