一、記憶體泄漏
1、什么是記憶體泄露
由于疏忽或者錯誤(例外安全)導致程式未能釋放已經不再使用的記憶體的情況,記憶體泄露并非是指記憶體在物理上的消失,而是指程式失去了對該記憶體的控制,導致的資源浪費,
2 、記憶體泄露的分類
a、堆記憶體泄露(Heap Leak)
通過malloc,realloc,new等方式從堆中分配的記憶體,并且完成后必須通過呼叫對應的free,delete 釋放,如果程式的設計的錯誤導致這部分記憶體沒有被釋放,那么此后這塊記憶體將不會被使用,就會產生Heap Leak,
b、系統資源泄露(Resource Leak)
使用系統分配的資源比如 :Bitmap,SOCKET 等沒有使用相應的函式釋放掉,導致系統資源的浪費,嚴重可導致系統效能降低,系統運行不穩定,
3、記憶體泄露的危害
a、如果申請的記憶體沒有釋放,隨著行程的正常結束,則這個記憶體會被自動釋放,
b、長期運行的程式遇到記憶體泄漏的問題,危害就非常的大,比如:作業系統、服務器,這些程式長期運行,若遇到記憶體泄露的問題會導致可用的記憶體越來越少,某些服務的操作失敗(打開檔案、創建套接字、發送資料),
二、VLD簡述
VLD(Visual Leak Detector)是一款用于 Visual C++ 的免費記憶體泄露檢測工具,相比較其它記憶體泄露檢測工具,它在檢測到記憶體泄漏的同時,還具有如下特點:
- 可以得到記憶體泄漏點的呼叫堆疊,如果可以的話,還能得到其所在檔案及行號;
- 可以得到泄露記憶體的完整資料; 可以設定記憶體泄露報告的級別;
- 它是一個已經打包的 lib,使用時無須編譯原始碼,對于使用者自己的代碼,只需要做很小的改動;
- 原始碼使用 GNU許可發布,并有詳盡的檔案及注釋,對于想深入了解堆記憶體管理的讀者,是一個不錯的選擇,
可見,VLD 簡單易用,只需要做很小的改動(添加庫并包含頭檔案),然后正常運行自己的程式,就可以發現記憶體問題;如果深入原始碼,可以學習到堆記憶體分配與釋放的原理、記憶體泄漏檢測的原理及記憶體操作的常用技巧等,
若為Linux環境強烈推薦使用Valgrind
推薦文章:
記憶體泄漏檢測工具valgrind神器
C++記憶體泄漏檢查工具——Valgrind(–tool = memcheck)
三、VLD記憶體泄漏檢測原理
1、Visual Leak Detector在Debug使用malloc,realloc,new等方式從堆中分配的記憶體,會在記憶體塊的頭中記錄分配該記憶體的檔案名及行號,當程式退出時CRT會在main()函式回傳之后做一些清理作業,這個時候來檢查除錯堆記憶體,如果仍然有記憶體沒有被釋放,則一定是存在記憶體泄漏,從這些沒有被釋放的記憶體塊的頭中,就可以獲得檔案名及行號,并將其轉換成報告輸出,
2、Visual Leak Detector將其初始化設定在compiler段,從而使得它在絕大多數全域變數和幾乎所有的用戶定義的全域變數之前初始化,
四、下載、安裝
CSDN下載:https://download.csdn.net/download/qq_43148810/34865979
Visual Leak Detector官網、下載:https://kinddragon.github.io/vld/
進入主頁后,點擊【Download Installer】按鈕進行下載 VLD 最新版本,
下載完成解壓安裝即可,
安裝目錄下有:
- bin(32位和64位的dll和pdb檔案,以及Microsoft.DTfW.DHL.manifest檔案)檔案夾
- inclode(vld.h和vld_def.h頭檔案)檔案夾
- lib(32位和64位的vld.lib)檔案夾
- vld.ini(配置)檔案
五、Visual Studio中使用
1、配置專案:
四步驟中軟體安裝已為VS2008-2015所有專案設定了【C/C++——常規——附加包含目錄】:C:\Program Files (x86)\Visual Leak Detector\include,以及【聯結器——常規——附加庫目錄】:C:\Program Files (x86)\Visual Leak Detector\lib\Win64(Win32),
- 專案代碼中可直接#include"vld.h";
- 【聯結器——輸入——附加依賴項】中添加vld.lib;
- 安裝目錄Bin檔案夾的對應版本檔案夾(Win32或Win64)所有檔案拷貝至輸出目錄,
2、測驗工程代碼
#include <iostream>
#include "vld.h"
int main(int argc, char* argv[])
{
char *pBuf = new char[200];
return 0;
}
運行完成后查看控制臺輸出或者VS的輸出視窗,

報告列出了記憶體泄露是在第幾塊、所在的地址、泄露的位元組、呼叫的堆疊、記憶體內容,雙擊呼叫堆疊可以跳轉到所在行,
六、Qt中使用
1、新建一個 Qt Console Application,在 .pro 檔案中添加如下內容
# 只有在 Win32 下才可使用
win32 {
CONFIG(debug, debug|release) { # 需要基于 Debug 模式
DEFINES += VLD_MODULE
VLD_PATH = "D:/Program Files/Visual Leak Detector"
INCLUDEPATH += $${VLD_PATH}/include
LIBS += -L$${VLD_PATH}/lib/Win32 -lvld
}
}
main.cpp 檔案如下所示:
#include <QCoreApplication>
// 添加 VLD 頭檔案
#ifdef VLD_MODULE
#include "vld.h"
#endif
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
char *pBuf = new char[200];
return a.exec();
}
編譯運行,在 Qt Creator 的應用程式輸出視窗中將會出現和 Visual Studio 中類似的記憶體泄露資訊,
使用 VLD 檢測記憶體泄露很容易,但在使用程序中,需要注意以下幾點:
- 需要在 Debug 模式下使用,如果是 Release 模式,則不會鏈接 VLD,
- 只能使用 VC++編譯器,這也是美中不足的一點,如果使用 Qt,只能先使用 VC++ 編譯器捕捉并解決記憶體泄露,再考慮使用mingw(gcc/g++)編譯程式,
Visual Leak Detector官網、下載:https://kinddragon.github.io/vld/
相關文章推薦:https://waleon.blog.csdn.net/article/details/52789085
https://blog.csdn.net/Outtch_/article/details/108677744
如有錯誤或不足歡迎評論指出!創作不易,轉載請注明出處,如有幫助,記得點贊關注哦(⊙o⊙)
更多內容請關注個人博客:https://blog.csdn.net/qq_43148810
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/340712.html
標籤:其他
上一篇:Selenium學習總結
