VS自带内存泄漏检测:CRT库使用教程

检测维修 0 134

C++使用CRT库检测内存泄漏的方法详解

更新的时间是,二零二四年,六月七日,十一点五十四分零三秒,作者是七凌。

最微妙、最难以找出的C/C++应用程序里的bug是内存泄漏,内存泄漏是因之前分配的内存没能正确解除分配造成的,有诸多内存泄漏的检测工具,CRT库是Visual Studio自带的,因而我们能够开箱即用,所以接下来我们一起去学习怎样运用CRT库检测内存泄漏。

C/C++应用程序里最为微妙、极难发现的bug是内存泄漏,内存泄漏是因先前分配的内存没能正确解除分配所致,最初少量的内存泄漏或未被发觉,然而随着时间的推进,会引发各类问题,从性能变差直至程序因内存不足而崩溃,存在内存泄漏的应用会耗尽所有可用内存,致使其他程序崩溃,进而让人难以辨别是哪个程序引发了问题,即便无害的内存泄漏也可能意味着存在其他需要纠正的问题。

一、CRT 库简介

许许多多的内存泄漏检测工具存在着,绝大多数的此类工具,都需要我们凭借手动方式去进行安装,而后才能够投入使用,然而,CRT(也就是C运行时库)库,它是Visual Studio自身所带有的,所以呢,我们能够直接使用,而不需要去安装别的内存泄漏检测工具。

所以下面我们就来一起学习一下如何使用CRT库检测内存泄漏:

CRT检测内存泄漏的原理是,内存分配需借助CRT在运行的时候来达成,只要于分配内存之际以及释放内存之时各别做好记录,当程序终止的时候,对比分配内存的记录与释放内存的记录,便能够确定是否存在内存泄漏。

二、CRT 库的使用1、启用内存泄漏检测

用于检测内存泄漏的主要工具是「C/C++ 调试程序」以及「CRT 调试堆函数」,要是想要启用调试堆的全部函数,在 C++ 程序里,依照以下顺序去包含以下语句:

#define _CRTDBG_MAP_ALLOC
#include 
#include 

2、设置应用退出时显示内存泄漏报告

实行上边那串语句启用调试堆函数之后,得于应用出口点之前安置 _CrtDumpMemoryLeaks,进而在应用退出之际展现内存泄漏报告。

_CrtDumpMemoryLeaks();

要是你的应用程序存在多个出口点,每一个出口点都得设置这个函数,这实在是太过复杂了,所以呢,我们能够在应用程序开头调用 _CrtSetDbgFlag,并且传入一些参数,以此来协助我们简化这个操作。

_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

_CRTDBG_LEAK_CHECK_DF

_CRTDBG_CHECK_ALWAYS_DF

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 
#include 
#include 
// 重定义 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来开展调试之际,于程序运行结束之后,于输出窗口之处,我们能够见到:

通过双击这条日志,我们能直接跳转到内存分配的位置。

这条日志包含的内容解释:

到此,这篇文章介绍了C++使用CRT库检测内存泄漏的方法详解,更多相关C++ CRT检测内存泄漏内容,请搜索脚本之家以前的文章,或继续浏览下面的相关文章,希望大家以后多多支持脚本之家!

相关推荐: