C++之內(nèi)存泄漏排查詳解
一 、經(jīng)驗(yàn)排查
有經(jīng)驗(yàn)的程序員會(huì)對(duì)程序中申請(qǐng)內(nèi)存的地方進(jìn)行排查,例如malloc或者new關(guān)鍵字的地方進(jìn)行跟蹤,一種情況是我們按照程序邏輯進(jìn)行了申請(qǐng)和釋放,要提防程序在發(fā)生異常時(shí)沒有如我們所期望的那樣進(jìn)行內(nèi)存釋放,此時(shí)也應(yīng)當(dāng)防止內(nèi)存泄漏。
二 、使用Visual Leak Detector for Visual C++
2.1 Visual Leak Detector for Visual C++簡(jiǎn)介
- Visual C++ 提供了內(nèi)置的內(nèi)存泄漏檢測(cè),但它的功能充其量只是最小的。此內(nèi)存泄漏檢測(cè)器是作為 Visual C++ 提供的內(nèi)置內(nèi)存泄漏檢測(cè)器的免費(fèi)替代品而創(chuàng)建的。以下是 Visual Leak Detector 的一些功能,內(nèi)置檢測(cè)器中不存在這些功能:
- 為每個(gè)泄漏塊提供完整的堆棧跟蹤,包括可用的源文件和行號(hào)信息。
檢測(cè)大多數(shù)(如果不是全部)進(jìn)程內(nèi)內(nèi)存泄漏類型,包括基于 COM 的泄漏和基于純 Win32 堆的泄漏。
- 選定的模塊(DLL 甚至主 EXE)可以從泄漏檢測(cè)中排除。
提供泄漏塊的完整數(shù)據(jù)轉(zhuǎn)儲(chǔ)(以十六進(jìn)制和 ASCII 格式)。
可定制的內(nèi)存泄漏報(bào)告:可以保存到文件或發(fā)送到調(diào)試器,并且可以包含可變級(jí)別的詳細(xì)信息。
其他用于 Visual C++ 的售后泄漏檢測(cè)器已經(jīng)可用。但大多數(shù)真正流行的,如 Purify 和 BoundsChecker,都非常昂貴。存在一些免費(fèi)的替代方案,但它們通常太具有侵入性、限制性或不可靠。 Visual Leak Detector 是目前唯一可免費(fèi)使用的 Visual C++ 內(nèi)存泄漏檢測(cè)器,它將上述所有專業(yè)級(jí)功能整齊地打包在一個(gè)易于使用的庫(kù)中。
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,只需要下載對(duì)應(yīng)的版本,進(jìn)行安裝即可。
2.2.3 進(jìn)行編譯
- 本代碼要求的vs版本為2019,博主使用的版本為為2015,在編譯時(shí)候會(huì)報(bào)錯(cuò)
項(xiàng)目-->屬性--->常規(guī)-->平臺(tái)工具集--->選擇 Visual Studio 2015(v140)確定,就OK
2.2.4 自帶gtest工程測(cè)試
- 編譯項(xiàng)目自帶的vld_main進(jìn)行測(cè)試,項(xiàng)目中自帶gtest工程對(duì)相關(guān)內(nèi)存泄漏場(chǎng)景進(jìn)行了自測(cè)
2.3 如何測(cè)試自己的項(xiàng)目呢
2.3.1 配置工程
在自己的工程中引入vld.h文件,并在鏈接庫(kù)中配置vld.lib庫(kù)
設(shè)置當(dāng)前工程為Debug模式,才能顯示堆棧相關(guān)的調(diào)用信息
2.3.2 編寫簡(jiǎn)單的測(cè)試用例
- 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 檢測(cè)結(jié)果如圖
程序執(zhí)行完之后會(huì)在終端顯示內(nèi)存泄漏的的個(gè)數(shù),并同時(shí)會(huì)打印相關(guān)的內(nèi)存泄漏的堆棧信息,當(dāng)鼠標(biāo)點(diǎn)擊終端信息輸出的位置時(shí),同時(shí)會(huì)在上方代碼指示哪一行出現(xiàn)內(nèi)存泄漏。
三、總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
C++中使用哈希表(unordered_map)的一些常用操作方法
C++標(biāo)準(zhǔn)庫(kù)中使用的unordered_map底層實(shí)現(xiàn)是哈希表,下面這篇文章主要給大家介紹了關(guān)于C++中使用哈希表(unordered_map)的一些常用操作方法,需要的朋友可以參考下2022-03-03C++通過類實(shí)現(xiàn)控制臺(tái)貪吃蛇
這篇文章主要為大家詳細(xì)介紹了C++通過類實(shí)現(xiàn)控制臺(tái)貪吃蛇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04java 出現(xiàn)NullPointerException的原因及解決辦法
這篇文章主要介紹了java 出現(xiàn)NullPointerException的原因及解決辦法的相關(guān)資料,這里說明出現(xiàn)NullPointerException 的原因的總結(jié),并說明該如何解決,需要的朋友可以參考下2017-08-08