【valgrind】使用valgrind来检查内存泄漏

valgrind是一款用于检查内存泄漏的工具,它能帮助开发者通过生成的log文件定位到具体的代码行,log文件中的summary会列出五类内存泄漏情况。包括definitely lost, indirectly lost, possibly lost, still reachable和suppressed。通过调整参数,可以控制哪些信息显示,从而更准确地找到和修复内存泄漏问题。" 118626666,10742440,Java实现DBScan聚类算法,"['数据挖掘', '算法实现', 'Java编程', '地理空间分析', '数据库']

valgrind可以用来检查内存泄露问题,检查日志会将可能出现的内存泄露告诉开发者,具体到了哪行代码中,开发者可以利用日志方便的找到自己程序中的内存泄漏问题。

1.安装
sudo pacman -S valgrind  #for manjaro
sudo apt-get install valgrind  #for ubuntu
2.检测内存泄漏

终端进入可执行文件所在的文件夹,输入

valgrind --tool=memcheck --leak-check=full --show-leak-kinds=all --undef-value-errors=no --log-file=log ./a.out  #其中a.out是可执行程序名

即可在终端所在文件夹下生成log文件,如图

  1 ==17030== Memcheck, a memory error detector                                 
  2 ==17030== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
  3 ==17030== Using Valgrind-3.14.0 and LibVEX; rerun with -h for copyright info
  4 ==17030== Command: ./BPlusTree
  5 ==17030== Parent PID: 12330
  6 ==17030==
  7 ==17030==
  8 ==17030== HEAP SUMMARY:
  9 ==17030==     in use at exit: 0 bytes in 0 blocks
 10 ==17030==   total heap usage: 45,181 allocs, 45,181 frees, 7,423,168 bytes a
 11 ==17030==
 12 ==17030== All heap blocks were freed -- no leaks are possible
 13 ==17030==
 14 ==17030== For counts of detected and suppressed errors, rerun with: -v
 15 ==17030== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)

在log文件最后会有个summary,其中对内存泄露进行了分类,总共有五类:

  • (1) “definitely lost” 意味着你的程序一定存在内存泄露;
  • (2)”indirectly lost”意味着你的程序一定存在内存泄露,并且泄露情况和指针结构相关
  • (3) “possibly lost” 意味着你的程序一定存在内存泄露,除非你是故意进行着不符合常规的操作,例如将指针指向某个已分配内存块的中间位置。
  • (4) “still reachable” 意味着你的程序可能是没问题的,但确实没有释放掉一些本可以释放的内存。这种情况是很常见的,并且通常基于合理的理由。
  • (5)”suppressed” 意味着有些泄露信息被压制了。在默认的 suppression 文件中可以看到一些 suppression 相关设置。

其中,如果二叉树的根节点被判定为”definitely lost”,则其所有子节点将被判定为”indirectly lost”,而如果你正确修复了类型为 “definitely lost” 的根节点泄露,那么类型为 “indirectly lost” 的子节点泄露也会随着消失。

对于如上图所示的情况,posslbly lost其实并没有造成内存上的影响,如果想要过滤掉该类报告信息,可以加入–show-possibly-lost=no ,而对于”still reachable” ,同样可以通过–show-reachable=yes来控制是否输出相应的信息。

3.查看内存泄露位置

在log中由summary往上翻即可看到对应的错误,错误是不断细化的。根据函数调用栈可以清楚的看到哪里出现了内存泄漏。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值