欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++使用CRT庫檢測內存泄漏的方法詳解

 更新時間:2024年06月07日 11:54:03   作者:七凌、  
內存泄漏是 C/C++ 應用程序中最微妙、最難以發(fā)現(xiàn)的 bug,存泄漏是由于之前分配的內存未能正確解除分配而導致的, 內存泄漏的檢測工具有很多,CRT庫,是Visual Studio 自帶的,所以我們可以開箱即用,所以下面我們就來一起學習一下如何使用CRT庫檢測內存泄漏

內存泄漏是 C/C++ 應用程序中最微妙、最難以發(fā)現(xiàn)的 bug,存泄漏是由于之前分配的內存未能正確解除分配而導致的。 最開始的少量內存泄漏可能沒被發(fā)現(xiàn),但隨時間推移,會導致各種問題,從性能變差到程序由于內存不足而崩潰。 內存泄漏的應用會耗盡全部可用內存,導致其它程序崩潰,從而讓人難以分辨是哪個程序引發(fā)問題。 即使無害的內存泄漏也可能表明存在其他應糾正的問題。

一、CRT 庫簡介

內存泄漏的檢測工具有很多,大多數(shù)的內存泄漏檢測工具都要我們手動安裝才能使用,但是CRT(C 運行時庫)庫,是Visual Studio 自帶的,所以我們可以開箱即用,無需安裝其他的內存泄漏檢測工具。

所以下面我們就來一起學習一下如何使用CRT庫檢測內存泄漏:

CRT檢測內存泄漏原理:內存分配要通過CRT在運行時實現(xiàn),只要在分配內存和釋放內存時分別做好記錄,程序結束時對比分配內存和釋放內存的記錄就可以確定是不是有內存泄漏。

二、CRT 庫的使用

1、啟用內存泄漏檢測

檢測內存泄漏的主要工具是 「C/C++ 調試程序」和 「CRT 調試堆函數(shù)」,若要啟用調試堆的所有函數(shù),在 C++ 程序中,按以下順序包含以下語句:

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
  • #define 語句將 CRT 堆函數(shù)的基礎版本映射到對應的調試版本,如果省略 #define 語句,內存泄漏轉儲包含的有用信息將有所簡化。
  • #include <crtdbg.h> 會將 malloc 和 free 函數(shù)映射到其調試版本 _malloc_dbg 和_free_dbg,它們跟蹤內存分配和解除分配。 此映射只在包含 _DEBUG的調試版本中發(fā)生。 發(fā)布版本則會使用普通的 malloc 和 free 函數(shù)。

2、設置應用退出時顯示內存泄漏報告

在使用了上面的語句啟用調試堆函數(shù)后,需要在應用出口點之前放置 _CrtDumpMemoryLeaks,從而在應用退出時顯示內存泄漏報告。

_CrtDumpMemoryLeaks();

如果你的應用程序有多個出口點,每一個出口點都要設置這個函數(shù)也太復雜了,所以我們可以在應用程序開頭調用 _CrtSetDbgFlag并傳入一些參數(shù)來幫助我們簡化這個操作。

_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
  • _CRTDBG_ALLOC_MEM_DF

    • 含義:啟用內存分配調試。
    • 作用:當啟用該標志時,CRT 會在每次內存分配時記錄調試信息,包括分配的文件名和行號。這些信息在內存泄漏報告中非常有用,可以幫助你確定內存泄漏發(fā)生的位置。
  • _CRTDBG_LEAK_CHECK_DF

    • 含義:啟用內存泄漏檢測。
    • 作用:當啟用該標志時,程序退出時 CRT 會自動檢查未釋放的內存,并生成內存泄漏報告。這可以幫助你發(fā)現(xiàn)和修復內存泄漏問題。
  • _CRTDBG_CHECK_ALWAYS_DF

    • 作用:當設置 該標志時,CRT會在每次分配或釋放內存時檢查整個堆的完整性。這意味著每次內存操作(如 malloc、free、new、delete)都會觸發(fā)堆完整性檢查。通過這種操作能檢測一些內存越界的問題。當然也可以手動調用_CrtCheckMemory() 函數(shù)進行立即檢測。

3、豐富內存泄漏報告

為了豐富我們的內存泄漏報告,我們可以重定義 new malloc 用以捕獲文件名和行號

// 重定義 new malloc 以捕獲文件名和行號
#ifdef _DEBUG
#define new   new(_NORMAL_BLOCK, __FILE__, __LINE__)
#define   malloc(s)  _malloc_dbg(s, _NORMAL_BLOCK, __FILE__, __LINE__)
#endif

4、演示使用

我們通過下面的一個完整的示例,展示如何使用 CRT進行內存泄漏檢測:

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#include <iostream>

// 重定義 new malloc 以捕獲文件名和行號
#ifdef _DEBUG
#define new   new(_NORMAL_BLOCK, __FILE__, __LINE__)
#define   malloc(s)  _malloc_dbg(s, _NORMAL_BLOCK, __FILE__, __LINE__)
#endif

void leakMemory() {
    int* p = new int[10]; // 這是一個內存泄漏示例
}

int main() 
{
    // 啟用內存分配調試和內存泄漏檢測
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF | _CRTDBG_CHECK_ALWAYS_DF);

    leakMemory();

    std::cout << "Program finished." << std::endl;
    
    return 0;
}

我們按F5進行調試時,當程序運行完畢,我們在輸出窗口可以看到:

通過雙擊這條日志,我們能直接跳轉到內存分配的位置。

這條日志包含的內容解釋:

  • 內存分配編號,在示例中為 164
  • 塊類型,在示例中為 normal 。
  • 十六進制內存位置,在示例中為0x0167D7C0。
  • 塊的大小,在示例中為 40 bytes。
  • 塊中前 16 個字節(jié)的數(shù)據(十六進制形式)

到此這篇關于C++使用CRT庫檢測內存泄漏的方法詳解的文章就介紹到這了,更多相關C++ CRT檢測內存泄漏內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C語言簡明講解歸并排序的應用

    C語言簡明講解歸并排序的應用

    這篇文章主要介紹了 c語言排序之歸并排序,歸并就是把兩個或多個序列合并,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • C++改變編程入口為main函數(shù)

    C++改變編程入口為main函數(shù)

    這篇文章主要介紹了C++改變編程入口為main函數(shù)的方法的相關資料,需要的朋友可以參考下
    2015-06-06
  • C++實現(xiàn)自定義撤銷重做功能的示例代碼

    C++實現(xiàn)自定義撤銷重做功能的示例代碼

    在使用c++做界面開發(fā)的時候,尤其是實現(xiàn)白板功能時需要自己實現(xiàn)一套撤銷重做功能.如果是qt則有QUndoable對象,可以直接拿來用。但是如果是使用gdi繪圖,則可能需要自己實現(xiàn)了。本文就來用C++實現(xiàn)自定義撤銷重做功能,需要的可以參考一下
    2022-12-12
  • ipv6實現(xiàn)udp編程示例

    ipv6實現(xiàn)udp編程示例

    這篇文章主要介紹了ipv6實現(xiàn)udp編程示例,需要的朋友可以參考下
    2014-03-03
  • C++ 中約瑟夫環(huán)替換計數(shù)器m(數(shù)組解決)

    C++ 中約瑟夫環(huán)替換計數(shù)器m(數(shù)組解決)

    這篇文章主要介紹了C++ 中約瑟夫環(huán)替換計數(shù)器m(數(shù)組解決)的相關資料,需要的朋友可以參考下
    2017-05-05
  • VC小技巧匯總之控件技巧

    VC小技巧匯總之控件技巧

    這篇文章主要介紹了VC小技巧匯總之控件技巧,對于VC的開發(fā)很有借鑒價值,需要的朋友可以參考下
    2014-07-07
  • Qt中CQGUI框架之陰影圓角窗口實現(xiàn)

    Qt中CQGUI框架之陰影圓角窗口實現(xiàn)

    這篇文章主要介紹了Qt中CQGUI框架之陰影圓角窗口實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • C++實現(xiàn)動態(tài)煙花代碼

    C++實現(xiàn)動態(tài)煙花代碼

    這篇文章主要介紹了利用C++實現(xiàn)的放煙花程序,用到了EGE圖形庫,文中的示例代碼講解詳細,對我們學習C++有一定幫助,需要的可以參考一下
    2023-01-01
  • C++如何實現(xiàn)BCD碼和ASCII碼的相互轉換

    C++如何實現(xiàn)BCD碼和ASCII碼的相互轉換

    這篇文章主要介紹了C++實現(xiàn)BCD碼和ASCII碼互轉,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • C語言全面梳理結構體知識點

    C語言全面梳理結構體知識點

    結構體是一些值的集合,這些值稱為成員變量,結構體的每個成員可以是不同類型的變量。本文將通過示例為大家詳細講講C語言中結構體的使用,需要的可以參考一下
    2022-07-07

最新評論