在VC中检测内存泄漏
声明:checkleaks.h和checkleaks.cpp这两个文件中的代码是在网上COPY的,但原来那个网站现在却找不到了
所以,这篇文章不算完全原创,呵呵。
就当作是一个存档吧
先上代码:
- //checkleaks.h
- #ifndef SET_DEBUG_NEW_H
- #define SET_DEBUG_NEW_H
- #ifdef _DEBUG
- #define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FILE__, __LINE__)
- #else
- #define DEBUG_CLIENTBLOCK
- #endif
- #define _CRTDBG_MAP_ALLOC
- #include <crtdbg.h>
- #ifdef _DEBUG
- #define new DEBUG_CLIENTBLOCK
- #endif
- #pragma once
- #if defined(WIN32)
- void setFilterDebugHook(void);
- #endif
- #endif
- //checkleaks.cpp
- #if defined(WIN32)
- #include <string.h>
- #include "crtdbg.h"
- #define FALSE 0
- #define TRUE 1
- _CRT_REPORT_HOOK prevHook;
- int reportingHook(int reportType, char* userMessage, int* retVal)
- {
- // This function is called several times for each memory leak.
- // Each time a part of the error message is supplied.
- // This holds number of subsequent detail messages after
- // a leak was reported
- const int numFollowupDebugMsgParts = 2;
- static bool ignoreMessage = false;
- static int debugMsgPartsCount = 0;
- // check if the memory leak reporting starts
- if ((strncmp(userMessage,"Detected memory leaks!/n", 10) == 0)
- || ignoreMessage)
- {
- // check if the memory leak reporting ends
- if (strncmp(userMessage,"Object dump complete./n", 10) == 0)
- {
- _CrtSetReportHook(prevHook);
- ignoreMessage = false;
- } else
- ignoreMessage = true;
- // something from our own code?
- if(strstr(userMessage, ".cpp") == NULL)
- {
- if(debugMsgPartsCount++ < numFollowupDebugMsgParts)
- // give it back to _CrtDbgReport() to be printed to the console
- return FALSE;
- else
- return TRUE; // ignore it
- } else
- {
- debugMsgPartsCount = 0;
- // give it back to _CrtDbgReport() to be printed to the console
- return FALSE;
- }
- } else
- // give it back to _CrtDbgReport() to be printed to the console
- return FALSE;
- };
- void setFilterDebugHook(void)
- {
- //change the report function to only report memory leaks from program code
- prevHook = _CrtSetReportHook(reportingHook);
- }
- #endif
- //main.cpp
- #include <windows.h>
- #include <stdio.h>
- #include "checkleaks.h"
- int main()
- {
- //一定要加上这句,而且要在DEBUG模式下才会有报告输出
- _CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
- int *arr;
- arr = new int;
- return 0;
- }
程序输出:
- Detected memory leaks!
- Dumping objects ->
- e:\vs2008\try\ctemp\ctemp\main.cpp(9) : {62} client block at 0x00503DE8, subtype 0, 4 bytes long.
- Data: < > CD CD CD CD
- Object dump complete.
- The program '[3348] ctemp.exe: Native' has exited with code 0 (0x0).
http://blog.csdn.net/small_qch/article/details/6856445
在VC中检测内存泄漏的更多相关文章
- VC使用CRT调试功能来检测内存泄漏
信息来源:csdn C/C++ 编程语言的最强大功能之一便是其动态分配和释放内存,但是中国有句古话:“最大的长处也可能成为最大的弱点”,那么 C/C++ 应用程序正好印证了这句话.在 C/C+ ...
- 在VC++中启用内存泄露检测
检测内存泄漏的主要工具是调试器和 CRT 调试堆函数.若要启用调试堆函数,请在程序中包括以下语句: #define CRTDBG_MAP_ALLOC#include <stdlib.h># ...
- Vc 检测内存泄漏
启用内存泄漏检测 检测内存泄漏是 C/c + + 调试器和 C 运行时库 (CRT) 的主要工具调试堆函数. 若要启用调试堆的所有函数,在 c + + 程序中,按以下顺序包含以下语句: C++复制 # ...
- 如何在linux下检测内存泄漏
之前的文章应用 Valgrind 发现 Linux 程序的内存问题中介绍了利用Linux系统工具valgrind检测内存泄露的简单用法,本文实现了一个检测内存泄露的工具,包括了原理说明以及实现细节. ...
- 如何在linux下检测内存泄漏(转)
本文转自:http://www.ibm.com/developerworks/cn/linux/l-mleak/ 本文针对 linux 下的 C++ 程序的内存泄漏的检测方法及其实现进行探讨.其中包括 ...
- 使用_CRTDBG_LEAK_CHECK_DF检查VC程序的内存泄漏(转)
我们知道,MFC程序如果检测到存在内存泄漏,退出程序的时候会在调试窗口提醒内存泄漏.例如: class CMyApp : public CWinApp{public:BOOL InitApplicat ...
- Android性能优化之利用LeakCanary检测内存泄漏及解决办法
前言: 最近公司C轮融资成功了,移动团队准备扩大一下,需要招聘Android开发工程师,陆陆续续面试了几位Android应聘者,面试过程中聊到性能优化中如何避免内存泄漏问题时,很少有人全面的回答上来. ...
- 系统剖析Android中的内存泄漏
[转发]作为Android开发人员,我们或多或少都听说过内存泄漏.那么何为内存泄漏,Android中的内存泄漏又是什么样子的呢,本文将简单概括的进行一些总结. 关于内存泄露的定义,我可以理解成这样 没 ...
- 了解 JavaScript 应用程序中的内存泄漏
简介 当处理 JavaScript 这样的脚本语言时,很容易忘记每个对象.类.字符串.数字和方法都需要分配和保留内存.语言和运行时的垃圾回收器隐藏了内存分配和释放的具体细节. 许多功能无需考虑内存管理 ...
随机推荐
- Tomcat部署问题及解决方法
1.gradle构建web时报错:Access restriction: The type JPEGImageEncoder is not accessible due to restriction ...
- VLC网页插件添加对火狐浏览器的支持
原文转自:http://blog.csdn.net/gsls200808/article/details/25536113 1.用<embed>标签 下面这段代码只支持火狐,不支持IE & ...
- 这是一个在Windows live 上实验的文章
这是一个windows 实验用的文章,希望一次成功
- windows shell备忘
1.查找占用80端口的进程idnetstat -aon|findstr "80" 2.查找进程id为"1000"的进程名tasklist|findstr &qu ...
- java 泛型处理
泛型是什么意思在这就不多说了,而Java中泛型类的定义也比较简单,例如:public class Test<T>{}.这样就定义了一个泛型类Test,在实例化该类时,必须指明泛型T的具体类 ...
- Linux 高可用(HA)集群之keepalived详解
http://freeloda.blog.51cto.com/2033581/1280962 大纲 一.前言 二.Keepalived 详解 三.环境准备 四.LVS+Keepalived 实现高可用 ...
- 【JavaScript】深入分析JavaScript的关系运算和if语句
JavaScript的关系运算,没有我原想的那么简单.等终于理清它的运算逻辑之后,我的头大了至少一圈.而if语句的真假判定逻辑本身不难,但要把它和关系运算联系起来,相信你会和我一样,到达崩溃边缘.不信 ...
- HTTP调试 抓包 工具 Fiddle 简介 示例
简介 1.常用抓包工具对比: Firebug虽然可以抓包,但是对于分析http请求的详细信息,不够强大.模拟http请求的功能也不够,且firebug常常是需要"无刷新修改",如果 ...
- 小学生之JAVA中的分层
三层架构 三层架构(3-tier application) 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI).业务逻辑层(BLL).数据访问层(DAL). 区分层次的目的即为了“高内聚,低 ...
- java反射机制(工厂模式)
http://www.phpddt.com/dhtml/338.html java里面没有typeof,js有. 我终于实现了用反射机制编写的工厂模式.java反射在工厂模式可以体现. 包含产品接口类 ...