使用CRT定位内存泄漏
1. 使能内存泄漏检测
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
注1:语句顺序不能修改;
注2:仅对DEBUG版本有效
注3:#define语句可以去掉,但leak dump会丢失细节信息,如:泄漏的代码文件及行号
2. 打印泄漏内存报告
在合适的地方调用下面的语句,即可看到内存泄漏报告:
_CrtDumpMemoryLeaks();
3. 如果应用程序有多个出口,可 以通过设置调试标志自动在程序退出时打印内存泄漏信息,而不是手动在每个出口添加:
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
4. 默认情 况下报告打印在VS的Debug面板的Output窗口,该行为可以通过下面的API进行修改:
_CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_DEBUG );
CRT内存泄漏报告解读。。
如果定义了_CRTDBG_MAP_ALLOC宏,报告会是这样:
Detected memory leaks!
Dumping objects ->
C:\PROGRAM FILES\VISUAL STUDIO\MyProjects\leaktest\leaktest.cpp(20) : {18}
normal block at 0x00780E80, 64 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
如果没有定义,则是这样:
Detected memory leaks!
Dumping objects ->
{18} normal block at 0x00780E80, 64 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
Object dump complete.
解读:
内存块号,这里是18;
内存块类型:这里是normal;
泄漏的内存地址:这里是0x00780E80;
泄漏的内存块大小,这里是64bytes;
泄漏内存的前16byte的十六进制值;
CRT内存类型有5种:
normal:应用程序自己开辟的内存块
client:MFC对象特有的类型
crt:crt自己使用的内存块
free:已经被释放的(不会出现在报告中)
ignore:应用程序显示标志为排除在内存泄漏报告中的内存块
CRT通过改写new和malloc来实现内存泄漏监视:
#ifdef _DEBUG
#ifndef DBG_NEW
#define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
#define new DBG_NEW
#endif
#endif // _DEBUG
设置内存开辟断点:
1.在监视窗口修改crt全局变量:_crtBreakAlloc,
如果使用/MD编译选项,需加上上下文操作符: {,,ucrtbased.dll}_crtBreakAlloc,如果使用/MD编译选项,需加上上下文操作符:
2. 通过CRT API设置 _CrtSetBreakAlloc(xx);
手动比较内存:
典型用法:
_CrtMemState s1;
_CrtMemCheckpoint( &s1 );
// memory allocations take place here
_CrtMemState s2;
_CrtMemCheckpoint( &s2 );
_CrtMemState s3;
if ( _CrtMemDifference( &s3, &s1, &s2) )
_CrtMemDumpStatistics( &s3 );
使用CRT定位内存泄漏的更多相关文章
- C++程序在Windows平台上各种定位内存泄漏的方法,并对比了它们的优缺点
一.前言 在Linux平台上有valgrind可以非常方便的帮助我们定位内存泄漏,因为Linux在开发领域的使用场景大多是跑服务器,再加上它的开源属性,相对而言,处理问题容易形成“统一”的标准.而在W ...
- VS2015 定位内存泄漏工具vld
介绍一款在vs2015开发环境定位内存泄漏工具:Visual Leak Detector ,具体的使用方法如下: 1. 安装vld-2.5-setup.exe (下载链接地址后面会给出),安装过程会 ...
- 【linux】linux下对java程序生成dump文件,并使用IBM Heap Analyzer进行分析,查找定位内存泄漏的问题代码
1.首先,java程序启动在linux,怎么生成dump文件? 1>第一步,首先你需要得到java程序的PID,最简单的方法使用如下命令 ps -ef|grep java 或者如果是docker ...
- C++中基于Crt的内存泄漏检测(重载new和delete,记录在Map里)
尽管这个概念已经让人说滥了 ,还是想简单记录一下, 以备以后查询. #ifdef _DEBUG#define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FIL ...
- Instruments leak黑魔法定位内存泄漏
leak是一款很赞的内存检查的工具,但在使用的过程中有点繁琐,至少有些底层的泄漏笔者还是不知道如何下手 下面介绍一下简单leak的使用: 首先你要确认你的target不会被拒绝,确保profile是d ...
- 用CRT查找内存泄漏
引用原文地址 : https://msdn.microsoft.com/en-us/library/x98tx3cf.aspx 1. 在program中严格按下面顺序include #define _ ...
- VC使用CRT调试功能来检测内存泄漏
信息来源:csdn C/C++ 编程语言的最强大功能之一便是其动态分配和释放内存,但是中国有句古话:“最大的长处也可能成为最大的弱点”,那么 C/C++ 应用程序正好印证了这句话.在 C/C+ ...
- java内存泄漏的定位与分析
1.为什么会发生内存泄漏 java 如何检测内在泄漏呢?我们需要一些工具进行检测,并发现内存泄漏问题,不然很容易发生down机问题. 编写java程序最为方便的地方就是我们不需要管理内存的分配和释放, ...
- Android应用内存泄漏的定位、分析与解决策略
什么是内存泄漏 对于不同的语言平台来说,进行标记回收内存的算法是不一样的,像 Android(Java)则采用 GC-Root 的标记回收算法.下面这张图就展示了 Android 内存的回收管理策略( ...
随机推荐
- Carmack在QUAKE3中使用的计算平方根的函数
// // Carmack在QUAKE3中使用的计算平方根的函数 // float CarmSqrt(float x){ union{ int intPart; float floatPart; } ...
- 关于javascript 数组的正态分布排序的一道面试题
最近几天顶着上海40°的凉爽天气找工作,心里是开心的不要不要的,每次面试都是要坐那里出半天汗才能回过神来,感觉到了这个世界对我深深的爱意,言归正传,面试过程中碰到了几次笔试,其中有这么一道题,由于实际 ...
- Spring-----5、Spring容器中的bean
转载自:http://blog.csdn.net/hekewangzi/article/details/45645831
- Apache的httpd命令详解
Apache的httpd命令详解 来源:全栈开发者 发布时间:2012-01-03 阅读次数:10965 4 httpd.exe为Apache HTTP服务器程序.直接执行程序可启动服务器的服务. ...
- 正三角形的外接圆面积,nyoj-274
正三角形的外接圆面积 时间限制:1000 ms | 内存限制:65535 KB 难度:0 描述给你正三角形的边长,pi=3.1415926 ,求正三角形的外接圆面积. 输入 只有一组测试数据 ...
- LINQ to Entities 不识别方法的解决方案
//这样不行 var BrushProducTimeout = aliexpressEntities.CP_BrushProduc.Where(p => p.isActive == true ...
- C语言的本质(22)——C标准库之字符串操作
编译器.浏览器.Office套件等程序的主要功能都是符号处理,符号处理功能在程序中占相当大的比例,无论多复杂的符号处理都是由各种基本的字符串操作组成的,下面介绍如何用C语言的库函数做字符串初始化.取长 ...
- Web.config中rewite 节点引起的500.19错误
刚刚接手一个外包的小项目,客户给了发布后的网站文件和数据库,想在本地搭建一套环境先运行下看看网站原有的效果.数据库还原什么都弄好了,数据库字符串也配置好,部署在本地IIS里面,访问了下,结果看到的是5 ...
- linux之SQL语句简明教程---CONCATENATE
有的时候,我们有需要将由不同栏位获得的资料串连在一起.每一种资料库都有提供方法来达到这个目的: MySQL: CONCAT( ) Oracle: CONCAT( ), || SQL Server: + ...
- sigaction函数解析
http://blog.chinaunix.net/uid-1877180-id-3011232.html sigaction函数解析 sigaction函数的功能是检查或修改与指定信号相关联的处理 ...