有谁知道我在哪里可以找到C ++的内存泄漏检测工具,它可以在命令行中运行,也可以在Windows和Linux中作为Eclipse插件运行。我希望它易于使用。最好不要覆盖new(),delete(),malloc()或free()。像GDB一样,如果它将在命令行中,但我不记得用于检测内存泄漏。如果有一个单元测试框架可以自动执行此操作,那就太棒了。
这个问题与其他问题类似(例如 Windows下用于GNU C / C ++的内存泄漏检测 )但我觉得它是不同的,因为那些要求Windows特定的解决方案或有我宁愿避免的解决方案。我觉得我在这里寻找更具体的东西。建议不必满足所有要求,但尽可能多的是好的。
谢谢。
编辑:由于这已经出现,通过“覆盖”我的意思是要求我#include一个库或者改变C ++如何编译我的代码的任何东西,如果它在运行时这样做,以便在不同的环境中运行代码赢了不会影响任何伟大的事情。另外,不幸的是,我没有Mac,所以对此的任何建议都没有用,但是谢谢你的尝试。我的桌面运行Windows(我安装了Linux,但我的双显示器无法使用它)而且我宁愿不在VM中运行Linux,尽管这当然是一种选择。我的笔记本电脑运行Linux,所以我可以在那里使用该工具,虽然我肯定更喜欢坚持我的桌面,因为屏幕空间非常适合保持所有设计文档和要求,而不必在桌面上移动太多。
注意:虽然我可以尝试答案,但在我尝试了这个建议并且令人满意之前,我不会将其标记为已被接受。
编辑2:我并不担心我的代码的跨平台兼容性,它只是一个使用C ++库的命令行应用程序。
Valgrind的 是你的 最好的朋友。 Valgrind有一个 插入 为了日食。
“可悲的是”Valgrind不能在Windows上运行,但它运行在Mac OSX,* BSD和Linux上,因此我认为这是“多平台”。 :)
Valgrind会“覆盖”new / delete / malloc / free,但不会在编译期间(因此,如果这是你的意思,你不必重新编译)。它解释二进制文件,因此在测试期间性能会受到一些影响。
对于32位应用程序,valgrind + wine也可以作为Windows应用程序的工作解决方案。如果你的应用程序可以在没有任何变化的情况下在wine下运行,那么在valgrind + wine下运行它可以很好地完成我的(非常有限的)体验。由于您的应用程序在Linux下运行,我猜您的应用程序可能会在wine下运行(避免使用特定于Windows的特定代码,而葡萄酒尚不支持)。
Valgrind的 是你的 最好的朋友。 Valgrind有一个 插入 为了日食。
“可悲的是”Valgrind不能在Windows上运行,但它运行在Mac OSX,* BSD和Linux上,因此我认为这是“多平台”。 :)
Valgrind会“覆盖”new / delete / malloc / free,但不会在编译期间(因此,如果这是你的意思,你不必重新编译)。它解释二进制文件,因此在测试期间性能会受到一些影响。
对于32位应用程序,valgrind + wine也可以作为Windows应用程序的工作解决方案。如果你的应用程序可以在没有任何变化的情况下在wine下运行,那么在valgrind + wine下运行它可以很好地完成我的(非常有限的)体验。由于您的应用程序在Linux下运行,我猜您的应用程序可能会在wine下运行(避免使用特定于Windows的特定代码,而葡萄酒尚不支持)。
虽然你提到这不是首选的 Boehm垃圾收集器可用于检测内存泄漏。简单地说,如果垃圾收集器实际上正在运行,那么通常你会有内存泄漏。 Mozilla以这种方式使用它来检测Firefox中的内存泄漏。
杜玛 是一个跨平台的泄漏检测库,我用于我的许多项目。这很好,因为你没有必要 #include
任何特定于DUMA的头,但只是在链接到系统的libc(包含内存分配例程)之前,以及在libstdc ++中链接之后链接到库中。
设置它可能有点棘手,特别是在与C ++项目一起使用时,但我认为投入的时间非常值得。它帮助我找到了一些内存泄漏之前我可能没有发现其他情况,以及一个我删除了两次分配的情况。
一个注意事项:如果您构建静态存档(在Windows上默认构建)会更容易,因为它有助于减少实际上由漏洞运行时引起的“误报”。
有 leaks
MacOS X上的工具(我不知道它是否存在于其他地方)我曾经在linux上使用一个名为memprof的工具。还有valgrind可以在linux上工作,并且令人难以置信的很棒,但是性能却大幅下降,表面上是在macos上,但我还没试过。
然而,我并不知道Windows上的任何此类工具。
在较新版本的gcc中有一些叫做 泄漏消毒剂。你只需要添加 -fsanitize=leak
编译命令。然后你正常运行你的程序,最后,如果有任何泄漏,你会得到摘要(当然在终端)。