(最新)delphi内存管理及fastmm研究

(最新)delphi内存管理及fastmm研究

ID:36676924

大小:81.51 KB

页数:11页

时间:2019-05-13

(最新)delphi内存管理及fastmm研究_第1页
(最新)delphi内存管理及fastmm研究_第2页
(最新)delphi内存管理及fastmm研究_第3页
(最新)delphi内存管理及fastmm研究_第4页
(最新)delphi内存管理及fastmm研究_第5页
资源描述:

《(最新)delphi内存管理及fastmm研究》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、Delphi7内存管理及FastMM研究作者:刘国辉一、引言FastMM是适用于delphi的第三方内存管理器,在国外已经是大名鼎鼎,在国内也有许多人在使用或者希望使用,就连Borland也在delphi2007抛弃了自己原有的饱受指责的内存管理器,改用FastMM.但是,内存管理的复杂性以及缺乏FastMM中文文档导致国内许多人在使用时遇到了许多问题,一些人因此而放弃了使用,我在最近的一个项目中使用了FastMM,也因此遇到了许多问题,经过摸索和研究,终于解决了这些问题。二、为什么要用FastMM第一个原因是FastMM的性能接近与delphi缺省内存管理器的两

2、倍,可以做一个简单的测试,运行下面的代码:varI:Integer;Tic:Cardinal;S:string;begintic:=GetTickCount;tryforI:=0to100000dobeginSetLength(S,I+100);edt1.Text:=S;end;finallySetLength(S,0);tic:=GetTickCount-Tic;MessageDlg('Tic='+IntToStr(Tic),mtInformation,[mbOK],0);end;end;在我的IBMT23笔记本上,使用FastMM4(FastMM的最新版本)用

3、时约为3300ms,而使用缺省的内存管理器,用时约为6200ms,FastMM4的性能提高达88%.第二个原因FastMM的共享内存管理器功能使用简单可靠。11当一个应用程序有多个模块(exe和dll)组成时,模块之间的动态内存变量如string的传递就是一个很大的问题,缺省情况下,各个模块都由自己的内存管理器,由一个内存管理器分配的内存也必须在这个内存管理器才能安全释放,否则就会出现内存错误,这样如果在一个模块分配的内存在另外一个模块释放就会出现内存错误。解决这个问题就需要使用到共享内存管理器,让各个模块都使用同一个内存管理器。Delphi缺省的共享内存管理器是

4、BORLNDMM.DLL,这个内存管理器并不可靠,也常常出现问题,并且,在程序发布的时候必须连同这个DLL一起发布。而FastMM的共享内存管理器功能不需要DLL支持,并且更加可靠。第三个原因是FastMM还拥有一些帮助程序开发的辅助功能,如内存泄漏检测功能,可以检测程序是否存在未正确释放的内存等。一、出现什么问题如果我们开发的应用程序,只有一个exe模块,那么,使用FastMM是一件非常简单的事情,只需要把FastMM.pas(最新版是FastMM4.pas)作为工程文件的第一个uses单元即可,如:programTest;usesFastMM4,…但是,通常情

5、况下,我们的应用程序都是由一个exe模块加上多个dll组成的,这样,当我们跨模块传递动态内存变量如string变量时,就会出问题,比如,下面的测试程序由一个exe和一个dll组成:librarytest;//test.dllusesFastMM4,…;procedureGetStr(varS:string;constLen:Integer);stdcall;beginSetLength(S,Len);//分配内存FillChar(S[1],Len,‘A’);end;exportsGetStr;11programTestPrj;usesFastMM4,…;//---

6、---------------unitmMain;//测试界面…procedureTForm1.btnDoClick(Sender:TObject);varI:Integer;S:string;BegintryforI:=1to10000dobeginGetStr(S,I+1);edt1.Text:=S;Application.ProcessMessages;end;finallySetLength(S,0);end;end;当第二次执行btnDoClick过程时,就会出现内存错误,为什么这样?delphi的字符串是带引用计数的,跟接口变量一样,一旦这个引用计数为

7、0,则会自动释放内存。在btnDoClick过程中,调用GetStr过程,用SetLength给S分配了一段内存,此时这个字符串的引用计数为1,然后执行edt1.Text:=S语句,字符串的引用计数为2,循环再调用GetStr给S重新分配内存,这样原来的字符串的引用计数减1,再执行edt1.Text:=S,原来的字符串引用计数为0,这时,就会被释放(注意,是在TestPrj.exe释放,而不是在Test.dll释放),但这时没有出错,当循环执行完毕之后,还有一个字符串的引用计数为2,但是执行SetLength(S,0)之后,该字符串被edt1.Text引用,的引用

8、计数为1,

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。