我在寻找内存泄漏检测库。 就像我只是将它包含到源代码中,然后它应该开始检测。外部程序可能是好的,但我正在寻找一些可链接到可执行文件的库。
这是我在寻找Windows。C++内存泄漏自动检测库
回答
对于我来说,这是很长的时间的最佳工具: http://www.paulnettle.com/pub/FluidStudios/MemoryManagers/Fluid_Studios_Memory_Manager.zip 就包括1个文件就大功告成了吧:)
如果您使用的是VC++,则内置了该功能。有关非MFC应用程序的信息,请参见Finding Memory Leaks Using the CRT Library,MFC应用程序请参阅Detecting memory leaks in MFC。
Visual Studio在Windows上具有此功能。请参阅http://msdn.microsoft.com/en-us/library/e5ewb1h3(v=VS.90).aspx。在Linux下,我不知道是否存在这样的情况,但valgrind真的很好找到所有类型的内存问题(不仅泄漏,而且例如无效读取)。
我可以建议Visual Leak Detector,它比Visual Studio内置的更容易使用。
您可以在代码中使用一些技术来检测内存泄漏。检测最常见也是最容易的方法是,定义一个宏DEBUG_NEW并将其与预定义的宏一起使用,例如__FILE__
和__LINE__
以查找代码中的内存泄漏。这些预定义的宏会告诉你内存泄漏的文件和行号。
DEBUG_NEW仅仅是通常被定义为一个宏:
#define DEBUG_NEW new(__FILE__, __LINE__)
#define new DEBUG_NEW
所以您随时随地使用new
,还可以跟踪哪些可以用来定位内存泄漏的文件和行号的你程序。
和__FILE__
,__LINE__
是predefined macros,它们分别评估您使用它们的文件名和行号!
阅读下面的文章,其说明使用DEBUG_NEW与其他有趣的宏,很漂亮的技术:
A Cross-Platform Memory Leak Detector
从Wikpedia,
DEBUG_NEW是指技术, C++ 过载和/或重新定义运算符 新的和运算符删除的顺序到 拦截内存分配和 解除分配调用,从而调试内存使用的 程序。 经常 涉及定义一个名为 DEBUG_NEW宏,使新成为 像新(_ FILE _,_ LINE _) 记录上 配置文件/行信息。 Microsoft Visual C++在其Microsoft“ 基础类中使用 此技术。有一些 方法来扩展此方法,以避免 使用宏重定义,而仍然 能够显示某些平台上的文件/行 信息。这种 方法有许多固有的限制。它仅适用于C++,并且 无法捕获像malloc这样的函数的内存泄漏。但是,它可以使用起来非常简单,并且与更多的 完整的内存调试器解决方案相比,速度更快。
除了以上,我可以告诉几个好程序:^)例如?对于Windows使用deleaker会很好。
- 1. 内存泄漏没有检测到CRT内存泄漏检测
- 2. 检测Android内存泄漏
- 3. 内存泄漏检测器
- 4. VisualVM内存泄漏检测
- 5. 检测Ruby内存泄漏
- 6. Tomcat7检测内存泄漏
- 7. 检测内存泄漏
- 8. 检测TWebModule内存泄漏
- 9. C++内存泄漏检测方法
- 10. C++内存泄漏,如何检测
- 11. C++内存泄漏检查
- 12. Java中的自动内存泄漏检测
- 13. 内存泄漏C
- 14. C#内存泄漏?
- 15. C#内存泄漏?
- 16. 内存泄漏-c
- 17. 内存泄漏C#
- 18. 内存泄漏C++
- 19. 使用chrome检测内存泄漏
- 20. 内存泄漏检测工具
- 21. 如何检测j2me内存泄漏?
- 22. 用Valgrind检测内存泄漏
- 23. Valgrind在fclose检测到内存泄漏()
- 24. 如何检测内存泄漏
- 25. 检测到内存泄漏! CwinThread
- 26. 检测到的内存泄漏
- 27. Windows API调用内存泄漏检测
- 28. DLL中的内存泄漏检测
- 29. 用Visual Studio 2010检测内存泄漏?
- 30. 使用AfxEnableMemoryTracking到检测内存泄漏
+1 from me。这是我最喜欢的检测泄漏方法之一,但保留一个分配的地址列表并检查它们是否与每次删除时发送删除的地址一致,这是性能激励(O(n)= nlog(n))。 ,只能在调试版本中使用该技术,而不能在发布版本中使用。 – 2011-04-04 05:52:40
@Als:我认为很明显,这种技术应该只用于调试版本,因为我选择的宏名称(或通常选择的)是'DEBUG_NEW'。 – Nawaz 2011-04-04 05:54:58
只是明确提到相同。反正你有我的+1 :)我看不到任何麒麟,就像其他日子一样.... – 2011-04-04 05:57:55