一、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
...
}
三、内存泄漏演示案例
#include <stdlib.h>
int main()
{
char *str = (char*)malloc(4);
free(str);
char *str2 = (char*)malloc(4);
return 0;
}
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;
}
gcc -g -o demo demo.c
- 使用工具检测demo程序是否存在内存泄漏,结果如下,显示无内存泄漏:
valgrind --tool=memcheck --leak-check=yes ./demo