valgrind 那点事
---------------------------------------
内存检测工具 valgrind要使用此工具,可以使用--tool=memcheck 在Valgrind命令行上指定。也可以不用指定,因为Memcheck是默认工具。Memcheck是一个内存错误检测器。它可以检测到C和C ++程序中常见的以下问题。
访问内存不应该,例如溢出和溢出堆块,溢出堆栈顶部,以及在释放内存后访问内存。使用未定义的值,即未初始化的值或从其他未定义的值派生的值。堆存储器的不正确释放,如双释放堆块,或错配的使用 malloc/ new/ new[] 与 free/ delete/delete[]重叠src和 dst指针 memcpy以及相关的功能。向size内存分配函数的参数传递一个腥意(推测为负值) 。
1.安装:
官网: http://valgrind.org/2.安装
[root@cf61420c928a soft]# bzip2 -d valgrind-3.13.0.tar.bz2 [root@cf61420c928a soft]# tar xf valgrind-3.13.0.tar
查看README后得知:
[root@e46ae471064e valgrind-3.13.0]# ./configure --prefix=/usr/local/valgrind[root@e46ae471064e valgrind-3.13.0]# make[root@e46ae471064e valgrind-3.13.0]# make install
show 版本
[root@e46ae471064e valgrind-3.13.0]# /usr/local/valgrind/bin/valgrind --versionvalgrind-3.13.0[root@e46ae471064e valgrind-3.13.0]#
3.测试
==54== ==54== LEAK SUMMARY:==54== definitely lost: 112 bytes in 1 blocks==54== indirectly lost: 0 bytes in 0 blocks==54== possibly lost: 6,464 bytes in 12 blocks==54== still reachable: 1,066,645 bytes in 3,864 blocks==54== suppressed: 0 bytes in 0 blocks==54== Rerun with --leak-check=full to see details of leaked memory==54== ==54== For counts of detected and suppressed errors, rerun with: -v==54== Use --track-origins=yes to see where uninitialised values come from==54== ERROR SUMMARY: 42349 errors from 200 contexts (suppressed: 0 from 0)[root@cf61420c928a GetUrl]#
关于内存泄露
Memcheck将内存泄露分为两种,一种是可能的内存泄露(Possibly lost),另外一种是确定的内存泄露(Definitely lost)。Possibly lost 是指仍然存在某个指针能够访问某块内存,但该指针指向的已经不是该内存首地址。Definitely lost 是指已经不能够访问这块内存。而Definitely lost又分为两种:直接的(direct)和间接的(indirect)。直接和间接的区别就是,直接是没有任何指针指向该内存,间接是指指向该内存的指针都位于内存泄露处。--https://www.ibm.com/developerworks/cn/linux/l-cn-valgrind/index.html