内存检测工具valgrind

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Peter_tang6/article/details/76833843

最近在学习数据结构的时候总是遇到关于内存错误的问题,因为数据结构这块多用指针,由此产生的段错误多不胜数,因此学习了一下valgrind这个工具,来检测我们的程序是如何出现内存问题的。

centos系统下的valgrind,首先我们得有autoconf和automake两个工具,一般系统都会自配。

安装过程:

wget http://valgrind.org/downloads/valgrind-3.10.1.tar.bz2
tar -jxvf valgrind-3.10.1.tar.bz2
cd valgrind-3.10.1
./autogen.sh   (这一步可能遇上没有安装上面两个工具的错误提示)
./configure
sudo make && make install
valgrind --version    (检测版本,看是否安装成功)

到此,我们的工具安装成功。

我们在编译程序的时候加上-g -fno-inline 保留调试信息。

下面是检测命令:

$ valgrind --tool=memcheck  --log-file=/home/trunk/valgrind_log_all --leak-check=full --error-limit=no  --show-leak-kinds=all ./a.out

其中–leak-check=full 指的是完全检查内存泄漏,–show-reachable=yes是显示内存泄漏的地点,–trace-children=yes是跟入子进程,–track-origins=yes查看哪里没有进行初始化。当程序正常退出的时候valgrind自然会输出内存泄漏的信息。log是存放详细信息的日志文件,我们将其显示在终端可不要

下面用几个小程序来试一下我们的工具:

#include <stdio.h>
void function()
{    
    int *p = (int*)malloc(10*sizeof(int));    
    p[10] = 0;
}
int main()
{    
    function();    
    return 0;
}

上面的程序很明显没有free而造成内存泄漏,内存泄露(Memory leak)指的是,在程序中动态申请的内存,在使用完后既没有释放,又无法被程序的其他部分访问。内存泄露是在开发大型程序中最令人头疼的问题,以至于有 人说,内存泄露是无法避免的。其实不然,防止内存泄露要从良好的编程习惯做起,另外,有工具帮助我们检测更好!

这是结果:

这里写图片描述

扫描二维码关注公众号,回复: 3048718 查看本文章
#include <stdio.h>
int main()
{    
    int a;    
    if (a==1)
    {        
        printf("a==%d\n",a);
        return 0;
    }
}

结果:
这里写图片描述

#include <stdio.h>
int main()
{    
    int *a = (int*)malloc(5*sizeof(int));    
    a[5] = 1;    
    return 0;
}

很明显的数组越界

这里写图片描述

在我们写代码的时候,注意我们的编程规范,才能写出完美的代码。

参考链接:http://www.open-open.com/lib/view/open1409296596322.html

猜你喜欢

转载自blog.csdn.net/Peter_tang6/article/details/76833843