使用CheckMem.Pas单元进行内存泄漏检查

关键字: 内存泄漏 checkMem.pas

摘要:

  这是一篇介绍如何使用CheckMem.pas单元检查delphi应用程序内存泄漏的文章

 

作者:999roseto347(fdaf at 163 dot com)

版本:V1.0

创建日期:2004-06-11

 

目录:

一、使用步骤

二、报告解读

三、测试例子

四、内存泄漏测试及修复的技巧

附:CheckMem.pas单元

 

一、使用步骤:

A)、将CheckMem.pas单元加入到工程中

B)、修改工程文件,将'CheckMem.pas'放到uses下的第一句

Code


我们先点击button1,然后退出。出现的报告如下:

当前出现 10 处内存漏洞 :
   0) 0000000000F3109C -   67($0043)字节 - 不是对象
   1) 0000000000F316A4 -   39($0027)字节 - 不是对象
   2) 0000000000F33798 -   55($0037)字节 - (未命名): TStringList (48 字节) - In Classes.pas
   3) 0000000000F337CC -  518($0206)字节 -  : TButton (512 字节) - In StdCtrls.pas
   4) 0000000000F339D0 -   42($002A)字节 - MS Sans Serif : TFont (36 字节) - In Graphics.pas
   5) 0000000000F339F8 -   38($0026)字节 - (未命名): TSizeConstraints (32 字节) - In Controls.pas
   6) 0000000000F33A1C -   30($001E)字节 - (未命名): TBrush (24 字节) - In Graphics.pas
   7) 0000000000F33A38 -   38($0026)字节 - 不是对象
   8) 0000000000F33A5C -   38($0026)字节 - 不是对象
   9) 0000000000F33A80 -   42($002A)字节 - 不是对象

把bb:=Tbutton.Create(nil);注释掉://bb:=Tbutton.Create(nil);再重新编译,然后运行,再点button1。出现的报告如下:

当前出现 3 处内存漏洞 :
   0) 0000000000F33798 -   55($0037)字节 - (未命名): TStringList (48 字节) - In Classes.pas
   1) 0000000000F337CC -   38($0026)字节 - 不是对象
   2) 0000000000F337F0 -   42($002A)字节 - 不是对象

说明了:一个对象未释放,将引起多处内存泄漏(因为一个对象可能包含多个子对象)

OK,我们再来测试button2(注意,这次我们不点击button1,只点击button2 一次),产生的报告如下:

当前出现 1 处内存漏洞 :
   0) 0000000000F33798 -   19($0013)字节 - 不是对象

再来一次,这次点击button2 三次:

当前出现 3 处内存漏洞 :
   0) 0000000000F33798 -   19($0013)字节 - 不是对象
   1) 0000000000F337A8 -   18($0012)字节 - 不是对象
   2) 0000000000F337B8 -   18($0012)字节 - 不是对象

这说明:对于每一个未释放的内存,CheckMem都将记录下来!再注意上面的未释放内存的地址是紧挨着的,因此如果看到这样的报告,可以猜想为一变量,多次分配,但未释放!

四、内存泄漏测试及修复的技巧:(翻译自MemProof帮助的部分内容,翻译得不好,请大家来信指导)

The following are a couple of tips that can be usefull when fixing leaks  in an application :

下面的这些技巧对于修复应用程序的内存泄漏非常有用:

* First just launch the app and then close it. If even this action generates leaks, fix those leaks first. Only after the main leaks are fixed, you should go into specific functionality areas of the application.

*首先,运行应用程序然后马上退出。如果这样操作也产生内存泄漏,先修复这些漏洞。只有先修复这些主要的泄漏,你才能进行特定功能的测试。

* In your Delphi/C++Builder project options, remove as much forms as possible from the Auto-Create option. Create your forms dynamically.

*在你的delphi/C++Builder工程选项中,尽可能地不要使用自动创建窗体,你需要时再动态创建。


* 注意在循环中创建或分配的内存的代码。如果它们未释放,可能引起大量的内存泄漏。

* Go for the biggest classes first - if you see a TMyFom <class> leaking, try to fix this one first instead of going after a tiny TFont class. Since a Form will usually contain a lot of other classes, with one shot you will have fixed a lot of contained leaks.

*先修复大的类,比如你看到TMyFom 类有泄漏,先解决它的问题,然后再解决像TFont 这样的小类。一个form类经常包含多个子类。修复一个form的未释放问题,你将解决大量该form包含的子对象未释的问题。

* Go for the easy fixes first. Some leaks fixes are very easy and obvious - if you fix the easy ones first, you will keep them out of your way.

*首先修复容易修复的漏洞。一些泄漏是非常容易被发现的,如果你先修复他们,你就不用老想着他们了。

 

附:CheckMem.pas单元

Code
posted @ 2009-07-27 12:16  Handll  阅读(349)  评论(0编辑  收藏  举报