如何检测内存泄漏。我的意思是有任何工具/实用程序可用或任何一段代码(即运算符new和delete的重载)或者我只需要检查代码中的new和delete吗?
如果有任何工具/实用程序,请告诉我。如果代码在那里,那么代码可以解释什么?
答案 0 :(得分:3)
可能对您有用的工具:
Linux:valgrind
Win32:MemoryValidator
如果使用适当的函数(new
{{malloc
释放它,则必须检查分配的每个内存位(...
,delete
,free
)。 1}},...
)。
答案 1 :(得分:2)
答案 2 :(得分:0)
一种方法是将模块分配内存的文件名和行号字符串(通过指针)插入分配的数据块中。使用C ++标准“ FILE ”和“ LINE ”宏来处理文件和行号。取消分配内存后,将删除该信息。
我们的一个系统具有此功能,我们将其称为“记忆猪报告”。因此,无论何时从我们的CLI,我们都可以打印出所有已分配的内存以及已分配内存的大量信息列表。此列表按哪个代码模块分配的内存最多排序。很多时候,我们会随着时间的推移以这种方式监视内存使用情况,最终内存耗尽(泄漏)会冒泡到列表的顶部。
答案 3 :(得分:0)
valgrind是一个非常强大的工具,可用于检测内存泄漏。安装后,您可以运行
valgrind --leak-check=full path/to/program arguments...
并且valgrind将运行程序,发现泄漏并向您报告。
答案 4 :(得分:0)
我还可以推荐UMDH:http://support.microsoft.com/kb/268343
答案 5 :(得分:0)
您最好的解决方案可能是使用valgrind,这是更好的工具之一。
如果您使用Xcode在OS X中运行,则可以使用“泄漏”工具。如果单击“使用性能工具运行”并选择“泄漏”,则会显示已分配和已泄露的内存。
要记住的事情。列出的大多数工具仅描述在发生内存泄漏时捕获内存泄漏的工具。因此,如果你有一些泄漏内存但很少被调用的代码(或者很少在测试内存泄漏时你没有遇到它),那么你可能会错过它。如果你想要实际运行代码的东西,你需要一个静态分析器。我所知道的唯一一个是Clang Static Analyzer,但它适用于C和Obj-C(我不知道它是否支持C ++)。