首先我们需要知道程序有没有内存泄露,然后定位到底是哪行代码出现内存泄露了,这样才能将其修复。
最简单的方法当然是借助于专业的检测工具,比较有名如
BoundsCheck,
功能非常强大,相信做
C++
开发的人都离不开它。此外就是不使用任何工具,而是自己来实现对内存泄露的监控,分如下两种情况:
一
.
在
MFC
中检测内存泄漏
假如是用
MFC
的程序的话,很简单。默认的就有内存泄露检测的功能。
我们用
VS2005
生成了一个
MFC
的对话框的程序
,
发现他可以自动的检测内存泄露
.
不用我们做任何特殊的操作
.
仔细观察
,
发现在每个
CPP
文件中
,
都有下面的代码
:
#ifdef _DEBUG
#define
new DEBUG_NEW
#endif
DEBUG_NEW
这个宏定义在
afx.h
文件中,就是它帮助我们定位内存泄漏。
在含有以上代码的
cpp
文件中分配内存后假如没有删除,那么停止程序的时候,
VisualStudio
的
Output
窗口就会显示如下的信息了:
Detected memory leaks!
Dumping objects -
>
d:
\
code
\
mfctest
\
mfctest
.
cpp
(
80
)
: {
157
} normal block at
0x003AF170
,
4
bytes long
.
Data:
<
>
00
00
00
00
Object dump complete
.
在
Output
窗口双击粗体字那一行,那么
IDE
就会打开该文件,定位到该行,很容易看出是哪出现了内存泄露。
二.检测纯
C++
的程序内存泄露
我试了下用
VisualStudio
建立的
Win32 Console Application
和
Win32 Project
项目,结果都不能检测出内存泄露。
下面一步一步来把程序的内存泄露检测的机制建立起来。
首先,我们需要知道
C
运行库的
Debug
版本提供了许多检测功能,使得我们更容易的
Debug
程序。在
MSDN
中有专门的章节讲这个,叫做
Debug Routines
,建议大家先看看里面的内容吧。
我们会用到里面很重要的几个函数。其中最重要的是
_CrtDumpMemoryLeaks();
自己看
MSDN
里的帮助吧。使用这个函数,需要包含头文件
crtdbg.h
该函数只在
Debug
版本才有用,当在调试器下运行程序时,
_CrtDumpMemoryLeaks
将在
“Output(
输出
)”
窗口中显示内存泄漏信息
.
写段代码试验一下吧,如下:
检测内存泄露版本一:
#include
"
stdafx.h
"
#include
<
crtdbg.h
>
int
_tmain(
int
argc, _TCHAR
*
argv[])
{
int
*
p
=
new
int
();
_CrtDumpMemoryLeaks();
return
0
;
}
运行后,在
Output
(输出)窗口,显示了如下的信息:
Detected memory leaks!
Dumping objects -
>
{
112
} normal block at
0x003AA770
,
4
bytes long
.
Data:
<
>
00
00
00
00
Object dump complete
.
但是这个只是告诉我们程序有内存泄露,到底在哪泄露了一眼看不出来啊。
看我们的检测内存泄露版本二:
#include
"
stdafx.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
int
_tmain(
int
argc, _TCHAR
*
argv[])
{
int
*
p
=
new
int
();
_CrtDumpMemoryLeaks();
return
0
;
}
该程序定义了几个宏,通过宏将