如何在源代码中查找内存泄漏

时间:2009-12-14 05:34:14

标签: c++ c memory-leaks

如果已知应用程序泄漏内存(执行时),那么在应用程序的源代码中找到此类内存泄漏错误的方法有哪些。
我知道某些解析器/工具(可能对代码进行静态分析)可以在这里使用,但有没有其他方法/技术可以做到这一点,特定于语言(C / C ++)/平台? /强>

9 个答案:

答案 0 :(得分:12)

  1. 使用-g标志编译代码
  2. 下载valgrind(如果你在Linux上工作)运行它--leak-check = yes选项
  3. 我认为valgrind是完成这项任务的最佳工具。

    对于Windows:请参阅此主题:Is there a good Valgrind substitute for Windows?

答案 1 :(得分:9)

有valgrind,可能还有其他很棒的工具。 但是我会告诉你我做了什么,对我来说效果非常好,因为很多次我在无法运行valgrind的环境中进行编码:

  • 确保将每个分配与释放配对。我总是数新闻或mallocs并搜索删除或免费。
  • 如果在C ++中并使用异常,请尝试将它们与构造函数/析构函数配对。如果您喜欢冒险,或者不能将它们放在Ctor / dtor中,请确保没有异常可以使程序流程不执行释放。
  • 使用智能指针和ptr容器。
  • 可以监视alloc / dealloc重写new或安装malloc处理程序。在某些时候,如果代码连续运行,那么显而易见的是,如果内存使用率变得固定并且不会在没有边界的情况下增长,这将是最糟糕的泄漏情况。
  • 小心不要收缩的容器,如矢量。有一些技巧可以缩小它们与空容器交换它们。

答案 2 :(得分:7)

内存泄漏检测,动态和静态分析有两种常用技术。

在动态分析中,您运行代码并使用工具分析运行以查看最终泄漏的内存。动态分析往往非常准确,但只能正确分析您在工具中执行的特定执行。因此,如果您的某些泄漏只发生在某些输入中并且您没有使用该输入的测试,则动态分析将无法检测到这些泄漏。

静态分析分析源代码以创建所有可能的代码路径,并查看是否可能在其中任何一个中发生泄漏。虽然静态分析现在非常好,但它并不完美 - 你不仅可以得到假阴性(分析错过泄漏),你也可以得到误报(该工具声称你实际上没有泄漏时有泄漏)。

有许多动态分析工具,包括Valgrind(开源但仅限于x86 Linux和Mac)和Purify(商业但也可用于Windows,Solaris和AIX)等众所周知的工具。维基百科也有一个不错的some other dynamic analysis tools列表。

在静态分析方面,我认为值得的唯一工具是Coverity(商业)。维基百科再次列出了many other static analysis tools

答案 3 :(得分:4)

Purify将会做一个看似神奇的工作

不仅内存泄漏,还有许多其他类型的内存错误。

它通过实时检测机器代码来工作,因此您不需要源代码或需要使用任何特定选项进行编译。

只需使用Purify(最简单的方法来执行此操作:CC="purify cc" make)来运行您的代码,运行您的程序,并获得一个很好的gui来显示您的泄漏和其他错误。

适用于Windows,Linux和各种Unix版本。有免费试用版下载。

  

http://www.ibm.com/software/awdtools/purify

答案 4 :(得分:0)

如果您使用智能指针并保留它们的表格,那么您可以分析它以告诉您仍在使用的内存。提供一个窗口来查看它,或者更常见的是,在程序终止之前流式传输到日志。

答案 5 :(得分:0)

就手动操作而言,我认为没有任何既定的做法。要使用精细的梳齿检查代码,在没有相应的new s(alloc s)的情况下查找delete s(free s),那就是那里它。

答案 6 :(得分:0)

您还可以使用purify检测内存泄漏。

答案 7 :(得分:0)

查找内存泄漏的通用指南并不多。幸运的是,有一个简单的准则可以防止大多数内存和其他资源的泄漏:使用RAII(资源获取是初始化),它们就不会开始。该名称是一个糟糕的描述,但如果你谷歌,它应该得到一些有用的点击。

答案 8 :(得分:0)

就个人而言,我建议您使用clone_ptr类来包装所有需要分配/释放内存的变量,该类在不再需要时为您执行所有内存释放。因此,您不必使用delete。它与auto_ptr非常相似。主要区别在于您不必处理棘手的所有权转移部分。可以在clone_ptr找到{{1}}上的更多信息和代码。