1. 程式人生 > >【工具】valgrind檢測C++程式碼記憶體洩漏

【工具】valgrind檢測C++程式碼記憶體洩漏

一、valgrind介紹:

valgrind是Linux下的一個開源工具,該工具用來檢測c++程式是否有非法使用記憶體的問題,例如訪問了未初始化的記憶體、訪問陣列時越界、忘記釋放動態記憶體等問題。Linux下使用命令或者原始碼安裝: 命令簡單安裝:

yum install valgrind

體系結構圖如下: 在這裡插入圖片描述

二、引數:

  --log-file=日誌檔名稱
  --num-callers=錯誤記錄的追蹤行數
  --leak-check=full開啟詳細的記憶體洩漏檢測器

三、實戰:

1、檢測記憶體洩漏:

#include<stdio.h>
#include<stdlib.h>
int main()
{
    int* p = (int*)malloc(sizeof(int));
    return 0;
}

編譯程式:gcc -g -o mem_discover mem_discover.cpp

gcc編譯程式的4個階段: 預處理階段:根據以#開頭的命令修改原始的c程式,也就是對標頭檔案的替換,可以使用gcc選項的-E來檢視。gcc指令的一般格式是:gcc [選項] 要編譯的檔案 [選項] [目標檔案],目標檔案可以預設,gcc預設生成的可執行檔案是.out。該階段處理過的檔案是.i檔案。 編譯階段:gcc要檢查程式碼的規範性,是否有語法錯誤,gcc把程式碼編譯成彙編程式碼。 使用者可以使用-S選項來檢視。該階段處理過的檔案為.s檔案。 彙編階段:將生成的.s檔案轉換為二進位制的目標檔案.o檔案。 連結階段:目標檔案轉為可執行檔案。

檢測:valgrind --tool=memcheck --leak-check=full ./mem_discover 結果: 在這裡插入圖片描述

2、檢測越界訪問(也是使用了未初始化記憶體):

#include<iostream>
using namespace std;
int main()
{
    int a[10] = {0,1,2,3,4,5,6,7,8,9};
    cout << a[10] << endl;
    return 0;
}

結果: 在這裡插入圖片描述

3、使用未初始化的記憶體:

#include<iostream>
using namespace std;
int main()
{
    int a=0,b;
    std::cout << b << endl;
    return 0;
}

結果: 在這裡插入圖片描述

4、記憶體讀寫越界:

#include<iostream>
#include<stdlib.h>
using namespace std;
int main()
{
    int *p = (int*)malloc(sizeof(int)*10);
    *(p+11)=100;
    std::cout << *(p+11) << endl;
    return 0;
}

結果: 在這裡插入圖片描述

5、使用了無效指標:

#include<stdio.h>
#include<stdlib.h>
int main()
{
    char* p = (char*)malloc(10);
    p[10] = 'x';
    free(p);
    return 0;
}

結果: 在這裡插入圖片描述

6、重複釋放記憶體:

#include<stdio.h>
#include<stdlib.h>
int main()
{
    char* p = (char*)malloc(10);
    free(p);
    free(p);
    return 0;
}

結果: 在這裡插入圖片描述

四、總結:

這是我第一次看到這種工具,只能說明人類大腦的強大!佩服!贊! 這種工具還能檢測程式碼中的死鎖問題,由於目前水平有限,後續會進行更新。 200多天了,感謝遇到的人,感謝大家的幫助,未來我會好好的~~:)