最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++使用CRT庫檢測內(nèi)存泄漏的方法詳解

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

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

一、CRT 庫簡介

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

所以下面我們就來一起學(xué)習(xí)一下如何使用CRT庫檢測內(nèi)存泄漏:

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

二、CRT 庫的使用

1、啟用內(nèi)存泄漏檢測

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

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

2、設(shè)置應(yīng)用退出時(shí)顯示內(nèi)存泄漏報(bào)告

在使用了上面的語句啟用調(diào)試堆函數(shù)后,需要在應(yīng)用出口點(diǎn)之前放置 _CrtDumpMemoryLeaks,從而在應(yīng)用退出時(shí)顯示內(nèi)存泄漏報(bào)告。

_CrtDumpMemoryLeaks();

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

_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
  • _CRTDBG_ALLOC_MEM_DF

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

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

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

3、豐富內(nèi)存泄漏報(bào)告

為了豐富我們的內(nèi)存泄漏報(bào)告,我們可以重定義 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進(jìn)行內(nèi)存泄漏檢測:

#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]; // 這是一個內(nèi)存泄漏示例
}

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

    leakMemory();

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

我們按F5進(jìn)行調(diào)試時(shí),當(dāng)程序運(yùn)行完畢,我們在輸出窗口可以看到:

通過雙擊這條日志,我們能直接跳轉(zhuǎn)到內(nèi)存分配的位置。

這條日志包含的內(nèi)容解釋:

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

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

相關(guān)文章

  • 詳解C++26 新特性

    詳解C++26 新特性

    C++26是C++語言的下一個重要標(biāo)準(zhǔn)版本,本文就來詳細(xì)的介紹C++26 新特性,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-03-03
  • C語言中數(shù)組的一些基本知識小結(jié)

    C語言中數(shù)組的一些基本知識小結(jié)

    這篇文章主要介紹了C語言中數(shù)組的一些基本知識小結(jié),其中重點(diǎn)是對于數(shù)組的內(nèi)存分配相關(guān)方面的知識整理,需要的朋友可以參考下
    2016-04-04
  • c語言輕松實(shí)現(xiàn)猜數(shù)字小游戲

    c語言輕松實(shí)現(xiàn)猜數(shù)字小游戲

    猜數(shù)字是興起于英國的益智類小游戲,起源于20世紀(jì)中期,一般由兩個人或多人玩,也可以由一個人和電腦玩。游戲規(guī)則為一方出數(shù)字,一方猜,今天我們來用C實(shí)現(xiàn)這個游戲案例
    2022-04-04
  • C++中字符串全排列算法及next_permutation原理詳解

    C++中字符串全排列算法及next_permutation原理詳解

    這篇文章主要為大家詳細(xì)介紹了C++中字符串全排列(遞歸法)和(迭代法)以及next_permutation底層原理,文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2023-02-02
  • C語言實(shí)現(xiàn)日期和時(shí)間處理的常用函數(shù)總結(jié)

    C語言實(shí)現(xiàn)日期和時(shí)間處理的常用函數(shù)總結(jié)

    在C語言中,時(shí)間和日期處理是一項(xiàng)非常基礎(chǔ)的技能,也是開發(fā)實(shí)際應(yīng)用程序時(shí)經(jīng)常會用到的功能,本文為大家總結(jié)了C語言中一些常用的時(shí)間庫函數(shù),希望對大家有所幫助
    2023-06-06
  • C++11 上下文關(guān)鍵字的具體實(shí)踐

    C++11 上下文關(guān)鍵字的具體實(shí)踐

    本文主要介紹了C++11 上下文關(guān)鍵字的具體實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • C++ Qt開發(fā)之LineEdit單行輸入組件的用法詳解

    C++ Qt開發(fā)之LineEdit單行輸入組件的用法詳解

    Qt 是一個跨平臺C++圖形界面開發(fā)庫,利用Qt可以快速開發(fā)跨平臺窗體應(yīng)用程序,在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實(shí)現(xiàn)圖形化開發(fā)極大的方便了開發(fā)效率,本章將重點(diǎn)介紹LineEdit單行輸入框組件的常用方法及靈活運(yùn)用
    2023-12-12
  • Qt生成隨機(jī)數(shù)的方法

    Qt生成隨機(jī)數(shù)的方法

    本文主要介紹了Qt生成隨機(jī)數(shù),生成隨機(jī)數(shù)主要用到了函數(shù)qsrand和qrand,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C++ string類getline()用法實(shí)例詳解

    C++ string類getline()用法實(shí)例詳解

    C++ getline()是一種標(biāo)準(zhǔn)庫函數(shù),用于從輸入流中讀取字符串或行,它是<string>標(biāo)頭的一部分,本文介紹C++ string類getline()用法詳解,感興趣的朋友一起看看吧
    2024-03-03
  • C++的輸入與輸出和格式化輸出

    C++的輸入與輸出和格式化輸出

    這篇文章主要介紹了詳解C++中的輸入與輸出和格式化輸出,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考,希望能夠給你帶來幫助
    2021-11-11

最新評論

明溪县| 青川县| 崇文区| 临洮县| 永吉县| 宝清县| 双柏县| 库尔勒市| 陆良县| 罗平县| 德州市| 怀远县| 扬中市| 前郭尔| 兰溪市| 蒲城县| 会东县| 平阳县| 哈巴河县| 宜兰县| 府谷县| 佛山市| 中宁县| 上饶县| 宁蒗| 修武县| 岢岚县| 大竹县| 东乌| 邵阳市| 吴旗县| 高清| 万年县| 布拖县| 共和县| 富裕县| 望奎县| 金川县| 江安县| 赫章县| 怀集县|