一、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