VS2005内存泄漏检测方法[转载]
一、非MFC程序可以用以下方法检测内存泄露:
1. 程序开始包含如下定义:
#ifdef _DEBUG
#define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FILE__, __LINE__)
#else
#define DEBUG_CLIENTBLOCK
#endif // _DEBUG
#define _CRTDBG_MAP_ALLOC
#include
#include
#ifdef _DEBUG
#define new DEBUG_CLIENTBLOCK
#endif // _DEBUG
2.程序中添加下面的函数:
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF|_CRTDBG_LEAK_CHECK_DF);
Debug版本程序运行结束后如有内存泄漏,输出窗口中会显示类似信息:
Detected memory leaks!
Dumping objects -> g:\programs\test\test.cpp(16) :
{51} client block at 0x00385C58, subtype 0, 4 bytes long.
Data: < > CD CD CD CD Object dump complete.
二、MFC程序内存泄漏检测方法:
1. 在 CMyApp 中添加如下三个 CMemoryState 类的成员变量:
#ifdef _DEBUG
protected: CMemoryState m_msOld, m_msNew, m_msDiff;
#endif // _DEBUG
2. 在 CMyApp::InitInstance() 中添加如下代码:
#ifdef _DEBUG
m_msOld.Checkpoint();
#endif // _DEBUG
3.在 CMyApp::ExitInstance() 中添加如下代码:
#ifdef _DEBUG
m_msNew.Checkpoint();
if (m_msDiff.Difference(m_msOld, m_msNew))
{
afxDump<<"\nMemory Leaked :\n";
m_msDiff.DumpStatistics();
afxDump<<"Dump Complete !\n\n";
}
#endif // _DEBUG
Debug版本程序运行结束后如有内存泄漏,输出窗口中会显示类似信息:
Memory Leaked :
0 bytes in 0 Free Blocks. 8 bytes in 1 Normal Blocks.
0 bytes in 0 CRT Blocks. 0 bytes in 0 Ignore Blocks.
0 bytes in 0 Client Blocks. Largest number used: 8825 bytes.
Total allocations: 47506 bytes.
Dump Complete !
Detected memory leaks!
Dumping objects -> g:\programs\chat\chatdlg.cpp(120) :
{118} normal block at 0x00D98150, 8 bytes long.
Data: < > A8 7F D9 00 01 00 00 00 Object dump complete.
开发工具:VS2005。(在VC++6.0中好像也可以这么用)
目的:检测C++代码中有无内存泄漏(即动态分配了内存,而没有正确释放)。
操作步骤:
一、把以下debug_new.h和debug_new.cpp文件加入项目中。
debug_new.h
- #ifndef _DEBUG_NEW_H_
- #define _DEBUG_NEW_H_
- #ifdef _DEBUG
- #undef new
- extern void _RegDebugNew( void );
- extern void* __cdecl operator new( size_t, const char*, int );
- extern void __cdecl operator delete( void*, const char*, int);
- #define new new(__FILE__, __LINE__)
- #define REG_DEBUG_NEW _RegDebugNew();
- #else
- #define REG_DEBUG_NEW
- #endif // _DEBUG
- #endif // _DEBUG_NEW_H_
debug_new.cpp
- //#include "debug_new.h"
- #ifdef _DEBUG
- #include
- #include
- class _CriSec
- {
- CRITICAL_SECTION criSection;
- public:
- _CriSec() { InitializeCriticalSection( &criSection ); }
- ~_CriSec() { DeleteCriticalSection( &criSection ); }
- void Enter() { EnterCriticalSection( &criSection ); }
- void Leave() { LeaveCriticalSection( &criSection ); }
- } _cs;
- void _RegDebugNew( void )
- {
- _CrtSetDbgFlag( _CRTDBG_REPORT_FLAG | _CRTDBG_LEAK_CHECK_DF );
- }
- void* __cdecl operator new( size_t nSize, const char* lpszFileName, int nLine )
- {
- // comment 1: MFC中提供的debug new虽然加了锁,但我在实际测试的时候发现多线程并发
- // 调用的时候还是抛出了系统错误,所以我在这里加了一个线程互斥量.
- // comment 2: debug new和debug delete之间需不需要互斥我并不知道,保险起见,我同样
- // 加了线程互斥量.
- // comment 3: 按照C++标准规定,在operator new失败后应当调用set_new_handler设置的
- // 函数,但是MSDN中却说"头文件new中的set_new_handler是stub的,而应该使
- // 用头文件new.h中的_set_new_handler",这简直是滑天下之大稽.
- // 以下是VC++6.0中的set_new_handler定义:
- // new_handler __cdecl set_new_handler( new_handler new_p )
- // {
- // assert( new_p == 0 ); // cannot use stub to register a new handler
- // _set_new_handler( 0 );
- // return 0;
- // }
- // 所以我也无计可施,只能舍弃set_new_handler的作用.
- _cs.Enter();
- void* p = _malloc_dbg( nSize, _NORMAL_BLOCK, lpszFileName, nLine );
- _cs.Leave();
- return p;
- }
- void __cdecl operator delete( void* p, const char* , int )
- {
- _cs.Enter();
- _free_dbg( p, _CLIENT_BLOCK );
- _cs.Leave();
- }
- #endif
二、在需要检测的DynamicMem.cpp中加入
1.
#include "debug_new.h"。
2.
使用调试堆函数:
#define _CRTDBG_MAP_ALLOC
#include
#include
注意:#include 语句的顺序。如果更改此顺序,所使用的函数可能无法正确工作。
3.main()中一开始处加入REG_DEBUG_NEW宏
4.在需要检测内存泄漏的地方添加下面这条语句来输出内存泄漏信息:
_CrtDumpMemoryLeaks();
测试实例程序:
DynamicMem.cpp
- #include
- #include
- #include "debug_new.h" // +
- #define _CRTDBG_MAP_ALLOC
- #include
- #include
- using namespace std;
- int main()
- {
- REG_DEBUG_NEW; // +
- char* name = new char[2];
- name[0] = 'A';
- name[1] = 'B';
- //delete name;
- _CrtDumpMemoryLeaks();
- cout << "--End--" << endl;
- return 0;
- }
三、按F5运行。
会在“调试”窗口中显示:
Detected memory leaks!
Dumping objects ->
e:/workspaces/c++/dynamicmem/dynamicmem/dynamicmem.cpp(78) : {120} normal block at 0x003B6360, 2 bytes long.
Data: 41 42
Object dump complete.
这说明有内存泄漏。
如里把delete[] name;前去掉注释,则“调试”窗口中就不会出现以上的信息,说明无内存泄漏。
以上参考:http://blog.sina.com.cn/s/blog_51396f890102f96e.html
VS2005内存泄漏检测方法[转载]的更多相关文章
- VS2005 检测内存泄漏的方法(转载)
一.非MFC程序可以用以下方法检测内存泄露: 1.程序开始包含如下定义: #ifdef _DEBUG #define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __F ...
- [教程] Android Native内存泄漏检测方法
转载请注明出处:https://www.cnblogs.com/zzcperf/p/9563389.html Android 检测 C/C++内存泄漏的方法越来越简便了,下面列举一下不同场景下检测C/ ...
- C++程序内存泄漏检测方法
一.前言 在Linux平台上有valgrind可以非常方便的帮助我们定位内存泄漏,因为Linux在开发领域的使用场景大多是跑服务器,再加上它的开源属性,相对而言,处理问题容易形成“统一”的标准.而在W ...
- 【转】简单内存泄漏检测方法 解决 Detected memory leaks! 问题
我的环境是: XP SP2 . VS2003 最近在一个项目中,程序退出后都出现内存泄漏: Detected memory leaks! Dumping objects -> {98500} n ...
- _CrtSetBreakAlloc简单内存泄漏检测方法,解决Detected memory leaks!问题
我的环境是: XP SP2 . VS2003 最近在一个项目中,程序退出后都出现内存泄漏: Detected memory leaks! Dumping objects -> {98500} n ...
- Windows 下的内存泄漏检测方法
在 Windows 下,可使用 Visual C++ 的 C Runtime Library(CRT) 检测内存泄漏. 首先,我们在.c或.cpp 文件首行插入这一段代码: #define _CRTD ...
- 【Visual Studio】简单内存泄漏检测方法 解决 Detected memory leaks! 问题(转)
原文转自 http://blog.csdn.net/u011430225/article/details/47840647 我的环境是: XP SP2.VS2003 最近在一个项目中, 程序退出后都出 ...
- C++ 简单内存泄漏检测方法
遇到个bug,MFC程序异常退出,debug模式下输出 Detected memory leaks! Dumping objects -> {366566} normal block at 0x ...
- C/C++内存泄漏检测方法
1. 内存泄漏 内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果. 2. 检测代码 使用链 ...
随机推荐
- 常用的mysql操作命令
1.[修改密码] 进入mysql中,使用命令:SET PASSWORD FOR 'root'@'localhost' = PASSWORD('新密码'); 2.[授权] GRANT SELECT, I ...
- Unity3D 新人学习的一点感想
想到那里写到那里吧 1.Unity3D的优点大家都知道:组件化.c#语言.可见即所得. 当初刚开始学习的是cocos2dx,c++的货,觉得还是写的不错的,也是国人开发的,真的代码很容易懂,直接看引擎 ...
- 【练习】数据文件的更改:改名或改路径 users01.dbf-->users01_bak.dbf
方法一:1.将数据文件的状态offline SQL> select file_name,tablespace_name from dba_data_files where file_name l ...
- MFC六大核心机制之一:MFC程序的初始化
很多做软件开发的人都有一种对事情刨根问底的精神,例如我们一直在用的MFC,很方便,不用学太多原理性的知识就可以做出各种窗口程序,但喜欢钻研的朋友肯定想知道,到底微软帮我们做了些什么,让我们在它的框架下 ...
- .Net 乱序方法
前两天开发一个奇葩的功能,突然间想到了用打乱顺序的方式解决.记录代码如下: /// <summary> /// 把收集回来的列表打乱顺序之后返回 /// </summary> ...
- C# (GDI+相关) 图像处理(各种旋转、改变大小、柔化、锐化、雾化、底片、浮雕、黑白、滤镜效果) (转)
C#图像处理 (各种旋转.改变大小.柔化.锐化.雾化.底片.浮雕.黑白.滤镜效果) 一.各种旋转.改变大小 注意:先要添加画图相关的using引用. //向右旋转图像90°代码如下 ...
- JS常用的设计模式(10)——模版方法模式
模式方法是预先定义一组算法,先把算法的不变部分抽象到父类,再将另外一些可变的步骤延迟到子类去实现.听起来有点像工厂模式( 非前面说过的简单工厂模式 ). 最大的区别是,工厂模式的意图是根据子类的实现最 ...
- css兼容
1.不同浏览器默认边距不同,必须对body自定义:margin:0;padding:0; 2.margin.padding属性值为%时,不是所有浏览器都支持: 3.transparent属性,IE7之 ...
- C#正则表达式语法规则详解
正则表达式通常包含字母文本(Literaltext)和元字符(metacharacter) 字母文本指的是普通文本如"abcde"可匹配字符串中任何包含"abcde&qu ...
- 浅谈Bootstrap自适应功能在Web开发中的应用
随着移动端市场的强势崛起,web的开发也变得愈发复杂,对于个体开发者来说,自己开发的网站,在电脑.手机.Pad等上面都要有正常的显示以及良好的用户体验.如果每次都要自己去调整网页去匹配各个不同的客户端 ...