Linux(程序设计):38---valgrind内存泄漏检测工具

一、valgrind介绍

  • valgrind官网:http://valgrind.org/
  • 对于java等语言来说,它们会自动管理内存,因此内存的管理不需要程序员来操作。对于C/C++程序来说,内存管理的责任就落到了程序员的身上
  • valgrind是一个内存检测工具,这个工具会对你的程序的任何内存泄漏做出报告

工具的安装

  • 输入下面的命令即可
sudo apt-get install valgrind

  • 安装之后查看版本

二、valgrind的使用注意事项

  • 编程程序时请示后DEBUG模式(例如gcc带上-g选项),否则valgrind程序运行时只知道你的程序存在内存泄漏,但是不知道内存泄漏带代码的第几行
  • 默认情况下,ØMQ会导致valgrind输出很多错误信息。要删除这些警告信息,请创建一个名为valgrind.supp的文件,包含内容如下,在运行valgrind时带上“--suppressions=./valgrind.supp”选项
{
    <socketcall_sendto>
    Memcheck:Param
    socketcall.sendto(msg)
    fun:send
    ...
}
{
    <socketcall_sendto>
    Memcheck:Param
    socketcall.send(msg)
    fun:send
    ...
}

三、内存泄漏演示案例

  • 代码如下,其中str2内存内存泄漏
#include <stdlib.h>

int main()
{
    char *str = (char*)malloc(4);
    free(str);
    char *str2 = (char*)malloc(4);
    return 0;
}
  • 编译程序,记得带上-g选项:
gcc -g -o demo demo.c
  • 使用工具检测demo程序是否存在内存泄漏,结果如下:
    • 3027是程序的PID
    • 可以看到程序申请了两次内存,释放了一次内存,总共申请了8字节的内存
    • 其中demo.c的第7行存在内存泄漏,因为没有释放内存
    • 总共泄漏了4字节的内存
valgrind --tool=memcheck --leak-check=yes ./demo

  • 如果编译时不带-g选项,那么结果如下所示,结果不会显示内存泄漏在第几行:

四、无内存泄漏演示案例

  • 代码如下,无内存泄漏
#include <stdlib.h>

int main()
{
    char *str = (char*)malloc(4);
    free(str);
    return 0;
}
  • 编译程序,记得带上-g选项:
gcc -g -o demo demo.c
  • 使用工具检测demo程序是否存在内存泄漏,结果如下,显示无内存泄漏:
valgrind --tool=memcheck --leak-check=yes ./demo

猜你喜欢

转载自blog.csdn.net/qq_41453285/article/details/106845520