Valgrind--Linux下检测内存泄漏

由于C和C++程序中常常需要程序员自主申请和释放内存,在大型的、复杂的应用程序中就会常常出现内存错误。Valgrind是linux环境下的一款功能齐全的内存调试和性能分析工具集,它包括MemcheckCallgrindCachegrindHelgrindMassif等工具。

本文分为三个部分:valgrind工具的下载与安装、实例解析、常用选项说明。通过这三部分的学习,读者可以基本掌握valgrind工具的内存调试方法。

1. 下载与安装
sudo apt install valgrind
2. 实例解析
#include<stdlib.h>
#include<iostream>
using namespace std;
void GetMemory(char*p,int num)
{
    p=(char*)malloc(sizeof(char)*num);//  申请了内存但是没有释放
}

int main(int argc,char**argv)
{
char*str=NULL;
GetMemory(str,100);
cout<<"Memory leak test!"<<endl;
return 0;
}

编译上述代码,得到可执行文件test。使用Valgrind允许可执行文件如下图所示:
《Valgrind--Linux下检测内存泄漏》

可以看到结果如下:
《Valgrind--Linux下检测内存泄漏》 内存泄漏检测 分析结果:

//11950 为进程ID
==11950== 100 bytes in 1 blocks are definitely lost in loss record 1 of 2
==11950==    at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==11950==    by 0x4008B1: GetMemory(char*, int) (in /home/zz/code/test)
==11950==    by 0x4008E0: main (in /home/zz/code/test)

上面的结果告诉我们是在main中调用了GetMemory导致的内存泄漏,GetMemory中是调用了malloc导致泄漏了100字节的内存。

3. Valgrind工具选项说明

valgrind 命令的基本格式为:valgrind [base option] --tool=<tool name> [tool option] your-program [program options]

本文仅列出了一些常用的选项,更详细的选项说明可参考valgrind home网站上的相关章节(http://www.valgrind.org/)。

a) Valgrind基本选项及其说明
--tool:指定使用的具体工具,可以为Memcheck、Callgrind、Cachegrind、Helgrind、Massif等工具;
b) Memcheck相关选项及其说明
--leak-check=<no|summary|yes|full> [default: summary]:no表示不检测,summary只显示统计信息,yes和full显示详细信息,即上述四种泄露的详细信息。

    原文作者:爱秋刀鱼的猫
    原文地址: https://www.jianshu.com/p/3f04e82c087d
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞