溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C++內(nèi)存泄漏的排查方法

發(fā)布時間:2021-10-11 09:10:43 來源:億速云 閱讀:344 作者:柒染 欄目:開發(fā)技術(shù)

C++內(nèi)存泄漏的排查方法,針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

    一 、經(jīng)驗排查

    有經(jīng)驗的程序員會對程序中申請內(nèi)存的地方進(jìn)行排查,例如malloc或者new關(guān)鍵字的地方進(jìn)行跟蹤,一種情況是我們按照程序邏輯進(jìn)行了申請和釋放,要提防程序在發(fā)生異常時沒有如我們所期望的那樣進(jìn)行內(nèi)存釋放,此時也應(yīng)當(dāng)防止內(nèi)存泄漏。

    二 、使用Visual Leak Detector for Visual C++

    2.1 Visual Leak Detector for Visual C++簡介

    • Visual C++ 提供了內(nèi)置的內(nèi)存泄漏檢測,但它的功能充其量只是最小的。此內(nèi)存泄漏檢測器是作為 Visual C++ 提供的內(nèi)置內(nèi)存泄漏檢測器的免費替代品而創(chuàng)建的。以下是 Visual Leak Detector 的一些功能,內(nèi)置檢測器中不存在這些功能:

    • 為每個泄漏塊提供完整的堆棧跟蹤,包括可用的源文件和行號信息。

    檢測大多數(shù)(如果不是全部)進(jìn)程內(nèi)內(nèi)存泄漏類型,包括基于 COM 的泄漏和基于純 Win32 堆的泄漏。

    • 選定的模塊(DLL 甚至主 EXE)可以從泄漏檢測中排除。

    提供泄漏塊的完整數(shù)據(jù)轉(zhuǎn)儲(以十六進(jìn)制和 ASCII 格式)。

    可定制的內(nèi)存泄漏報告:可以保存到文件或發(fā)送到調(diào)試器,并且可以包含可變級別的詳細(xì)信息。

    其他用于 Visual C++ 的售后泄漏檢測器已經(jīng)可用。但大多數(shù)真正流行的,如 Purify 和 BoundsChecker,都非常昂貴。存在一些免費的替代方案,但它們通常太具有侵入性、限制性或不可靠。 Visual Leak Detector 是目前唯一可免費使用的 Visual C++ 內(nèi)存泄漏檢測器,它將上述所有專業(yè)級功能整齊地打包在一個易于使用的庫中。

    2.2 Visual Leak Detector源碼獲取編譯

    2.2.1 源碼獲取,相關(guān)git地址
       git clone  https://github.com/oneiric/vld
    2.2.2 發(fā)布版本獲取
    • 在git主頁有Visual Leak Detector for Visual C++ Releases,只需要下載對應(yīng)的版本,進(jìn)行安裝即可。

    2.2.3 進(jìn)行編譯
    • 本代碼要求的vs版本為2019,博主使用的版本為為2015,在編譯時候會報錯

     項目-->屬性--->常規(guī)-->平臺工具集--->選擇 Visual Studio 2015(v140)確定,就OK
    2.2.4 自帶gtest工程測試
    • 編譯項目自帶的vld_main進(jìn)行測試,項目中自帶gtest工程對相關(guān)內(nèi)存泄漏場景進(jìn)行了自測

    2.3 如何測試自己的項目呢

    2.3.1 配置工程

    在自己的工程中引入vld.h文件,并在鏈接庫中配置vld.lib庫

    C++內(nèi)存泄漏的排查方法

    C++內(nèi)存泄漏的排查方法

    C++內(nèi)存泄漏的排查方法

    設(shè)置當(dāng)前工程為Debug模式,才能顯示堆棧相關(guān)的調(diào)用信息

    C++內(nèi)存泄漏的排查方法

    2.3.2 編寫簡單的測試用例
    • three.h

      #pragma once
      class three
      {
      public:
          three();
          ~three();
      };
    • three.cpp

     #include "three.h"
    
     three::three()
     {
     }
    
     three::~three()
     {
     }
    • main.cpp

      #include<stdlib.h>
      #include<stdio.h>
      #include <iostream>
      #include <vld.h>
      #include "three.h"
      using namespace std;
    
      int main()
      {
          cout << "vld test begin" << endl;
          int *one = new int[30];
          char *two = new char[40];
          three * tmp = new three();
          return 0;
      }
    2.3.3 檢測結(jié)果如圖

    C++內(nèi)存泄漏的排查方法

    程序執(zhí)行完之后會在終端顯示內(nèi)存泄漏的的個數(shù),并同時會打印相關(guān)的內(nèi)存泄漏的堆棧信息,當(dāng)鼠標(biāo)點擊終端信息輸出的位置時,同時會在上方代碼指示哪一行出現(xiàn)內(nèi)存泄漏。

    關(guān)于C++內(nèi)存泄漏的排查方法問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識。

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

    c++
    AI