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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章