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

Ank*_*kur 8 c c++ memory-leaks

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

mat*_*ekm 12

  1. 使用-g标志编译您的代码
  2. 下载valgrind(如果您在Linux上工作),使用--leak-check = yes选项运行它

我认为valgrind是完成这项任务的最佳工具.

对于Windows:请参阅此主题:Valgrind是否有适合Windows的替代品?


pio*_*otr 9

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

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

  • 最重要的成语:RAII(http://en.wikipedia.org/wiki/RAII).它确保正确的资源释放. (2认同)

R S*_*hko 7

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

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

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

有许多动态分析工具,包括Valgrind(开源但仅限于x86 Linux和Mac)和Purify(商业但也可用于Windows,Solaris和AIX)等众所周知的工具.维基百科也有一些其他动态分析工具.

在静态分析方面,我认为值得的唯一工具是Coverity(商业).维基百科再次列出了许多其他静态分析工具.