您好,登錄后才能下訂單哦!
C++內(nèi)存泄漏的排查方法,針對這個問題,這篇文章詳細(xì)介紹了相對應(yī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 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è)級功能整齊地打包在一個易于使用的庫中。
git clone https://github.com/oneiric/vld
在git主頁有Visual Leak Detector for Visual C++ Releases,只需要下載對應(yīng)的版本,進(jìn)行安裝即可。
本代碼要求的vs版本為2019,博主使用的版本為為2015,在編譯時候會報錯
項目-->屬性--->常規(guī)-->平臺工具集--->選擇 Visual Studio 2015(v140)確定,就OK
編譯項目自帶的vld_main進(jìn)行測試,項目中自帶gtest工程對相關(guān)內(nèi)存泄漏場景進(jìn)行了自測
在自己的工程中引入vld.h文件,并在鏈接庫中配置vld.lib庫
設(shè)置當(dāng)前工程為Debug模式,才能顯示堆棧相關(guān)的調(diào)用信息
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; }
程序執(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)知識。
免責(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)容。