C++检测内存泄漏方法
1.检测内存泄漏方法
这里先介绍一下windows下VS运行C/C++工程检测内存泄漏的方法。
Visual Studio 调试器和 C 运行时 (CRT) 库为我们提供了检测和识别内存泄漏的有效方法。VC++ IDE 的默认状态是没有启用内存泄漏检测机制的,也就是说即使某段代码有内存泄漏,Output 窗口也不会输出有关内存泄漏信息。必须手动设定两个最基本的机关来启用内存泄漏检测机制。
一是包含调试堆函数库文件:
#include<crtdbg.h>
通过包含crtdbg.h 头文件,可以将 malloc 和 free 函数映射到其“调试”版本 _malloc_dbg 和 _free_dbg,这些函数会跟踪内存分配和释放。此映射只在调试(Debug)版本(也就是要定义_DEBUG)中有效。
二是在需要检测内存泄漏的地方添加下面这条语句来输出内存泄漏信息:
_CrtDumpMemoryLeaks();
_CrtDumpMemoryLeaks()是打印当前的内存泄漏。注意是“当前”,也就是说当它执行时,所有未销毁的对象均会报内存泄漏。因此尽量让这条语句在程序的最后执行。它所反映的是检测到泄漏的地方。当在调试器下运行程序时,_CrtDumpMemoryLeaks将在Output窗口的 Debug页中显示内存泄漏信息,一般是已Detected memory leaks!开头的部分信息。
最好在代码中增加
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
#endif
宏定义,可以输出内存泄漏具体的文件位置信息。
【代码验证】
#include<crtdbg.h>
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
#endif
int main()
{int* p = new int[10];_CrtDumpMemoryLeaks();return 0;
}
调试输出窗口输出信息如下内存泄漏信息图:
上图中指出在main.cpp文件第7行存在申请的起始地址为0x005400B8的40字节堆内存泄漏。
其实也可以在不直接调用_CrtDumpMemoryLeaks()函数的情况下,在main()函数一开始位置通过调用_CrtSetDbgFlag函数设置_crtDbgFlag为_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF,这样系统将在程序结束的时候,自动调用_CrtDumpMemoryLeaks()函数,打印出所有内存泄露的信息。
【代码验证】
#include<crtdbg.h>
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
#endif
int main()
{_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);int* p = new int[10];return 0;
}
打印的内存泄漏信息与上述内存泄漏信息图是一致的。
另外,在图13中,内存泄漏信息除了打印该内存泄漏的内存分配语句所在的文件名、行号外,我们注意到有一个比较陌生的信息:{147}。这个整数值代表了什么意思呢?其实,它表示block number,泄露内存所在的块号。这个例子,{147}代表了块号为147的内存发生了泄漏。
我们可以在分配块号{147}的内存时,程序中断。以此来定位内存泄露的大概位置。那么就需要在内存分配之前调用_CrtSetBreakAlloc(long lBreakAlloc)该函数来设置断点。
【代码验证】
#include<crtdbg.h>
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
#endif
int main()
{_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);_CrtSetBreakAlloc(147);int* p = new int[10];return 0;
}
在运行上述程序时,会等待中断。
C++检测内存泄漏方法相关推荐
- VC使用CRT调试功能来检测内存泄漏
信息来源:csdn C/C++ 编程语言的最强大功能之一便是其动态分配和释放内存,但是中国有句古话:"最大的长处也可能成为最大的弱点",那么 C/C++ 应用程序正好印证 ...
- 如何在linux下检测内存泄漏
1.开发背景 在 windows 下使用 VC 编程时,我们通常需要 DEBUG 模式下运行程序,而后调试器将在退出程序时,打印出程序运行过程中在堆上分配而没有释放的内存信息,其中包括代码文件名.行号 ...
- VC使用CRT调试功能检测内存泄漏(转载)
/*********************************************************************************** 检测内存泄漏的基本工具是调试器 ...
- VC++ 6.0 中如何使用 CRT 调试功能来检测内存泄漏[转]
/C++ 编程语言的最强大功能之一便是其动态分配和释放内存,但是中国有句古话:"最大的长处也可能成为最大的弱点",那么 C/C++ 应用程序正好印证了这句话.在 C/C++ 应用程 ...
- vs2008 使用Visual Leak Detector检测内存泄漏
http://hi.baidu.com/maydaygmail/item/8ea6ebef87ca9103560f1dfe 转自:http://hi.baidu.com/sunchongjing/bl ...
- 使用CRT调试功能来检测内存泄漏
C/C++ 编程语言的最强大功能之一便是其动态分配和释放内存,但是中国有句古话:"最大的长处也可能成为最大的弱点",那么 C/C++ 应用程序正好印证了这句话.在 C/C++ 应用 ...
- unity如何检测内存泄漏_如何排查Java内存泄漏?看懂这一篇就够用了
原文:https://www.toptal.com/java/hunting-memory-leaks-in-java 作者:Jose Ferreirade Souza Filho 译者:Emma来源 ...
- 使用 Visual Leak Detector 检测内存泄漏
个人心得:挺不错,可以定位到指针所在文件,甚至是函数及行号.使用也挺方便. 感谢开源代码!http://vld.codeplex.com/ 转载自:http://www.51testing.com/? ...
- leakCanary检测内存泄漏的原理
LeakCanary是Square公司为Android开发者提供的一个自动检测内存泄漏的工具,LeakCanary本质上是一个基于MAT进行Android应用程序内存泄漏自动化检测的的开源工具,我们可 ...
最新文章
- django安装mysql驱动
- (转)Paper list of Meta Learning/ Learning to Learn/ One Shot Learning/ Lifelong Learning
- linux获取网卡的ip,Windows和Linux系统下获取多网卡的ip地址
- MyBatis-11MyBatis动态SQL之【if】
- Coursera公开课笔记: 斯坦福大学机器学习第二课“单变量线性回归(Linear regression with one variable)”
- 一个奇葩的网络问题,把技术砖家搞蒙了
- IBASE component删除出错
- sublime 3143 注册码
- 金山毒霸的云查杀很牛X
- 华为云全球首发企业级AI应用开发套件ModelArts Pro,加速行业AI落地
- 手机壁纸 NBA群星高清壁纸
- Linux NVMe Driver学习笔记之6:Admin Queue与Blk-mq初始化
- python代码求圆锥体积_计算圆锥体积的c++程序
- 查看 Chrome 下载的文件的真实下载地址
- 七月的尾巴,我不是狮子座
- 一个补丁迭代了16个版本后被撤,我的 Linux内核之旅!
- Win 10-jdk 8 下载和安装步骤
- 状语和状语从句的使用
- 使用递归函数计算1到n之和
- 跳槽加薪谋发展还是等公司配股?