delphi+中delphi adoquery 循环出错时,怎么销毁,防止内存泄漏

查看:4220|回复:1
由于维护一些旧系统,还得继续使用delphi7.0
delphi7编译慢 或linking阶段会出错 经常会出现内存泄漏或不足 或RLink32.DLL访问出错等
这个问题是近两年工作中出现,一个旧的进销存系统,修修补补六七年,其中有七八个同事增加模块或修改,又没用使用版本控制或源代码管理工具,源码管理比较乱阿。
另外公司办公用的电脑又老又旧, 奔四 前两年有同事还用512内存,最近一两年要求下才增加到1GB
由于以前十年来,公司用delphi7编写OA 或进销存(公司内外称之为ERP 实际没有达到哪个水平) 一直在win98/win2000下系统环境下编程,最近才有少数电脑换作winxp 当然,也买有win7 不过win7 有的部分同win2000/winxp有差异,一些着色 日历或其他不知能否向下兼容,没用安装delphi7 来用,
从去年四月份开台,进销存的源码在本机就不能正常编译 ,大体原因我各同事都知道,由于常年维护修补,源码产生大量垃圾代码,使得代码量大增,本机环境 : winxp sp3&&p4 2.4 DDR 333&&1GB&&delphi7.0
由于代码乱,又没有版本控制,想删除或移除部分代码出本工程也是个问题,只要动一两下,一编译又出错
于是,开始怀疑 winxp 下的内存或环境变量设置或其他问题
从此就开台不断下载delphi的各种版本 delpih lite 精简完全版 由delphi 7 lite 7.3.4.2&&到 delphi 7 lite 7.3.4.3
delphi 7.0 加 update1.1&&等 试来试去,均是编译十次有七八次通不过或生成EXE文件无效
说明:win2000 专业版 delphi7.0&&p4 硬件 1GB内存&&编译进销存代码 十次有七八次可通过 或能生成EXE文件
直到今天 网上查到有朋友说:直接把delphi2006下的bolndmm.dll与rlink32.dll拷贝至delphi7下的bin目录中
直接把delphi2010下的bolndmm.dll与rlink32.dll拷贝至delphi7下的bin目录中
可能改善这种编译效率或出错
但delphi2006 下载只有一种5CD版 本机硬盘太小,
后来想了一种办法,用delhi XE 的内存管理器来试试
本机安装有delphi XE
直接把delphi XE 下的bolndmm.dll与rlink32.dll拷贝至delphi7下的bin目录中 对进销存代码编译&&马上通过 也可以调试了
按网友的说法 新版的内存管理器或连接器 bolndmm.dll与rlink32.dll 经过优化
本帖最后由 kkbluesky 于
20:42 编辑
:)1 很好,
我用的2010,要加个文件borlndmm.dat温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(1442)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
在LOFTER的更多文章
loftPermalink:'',
id:'fks_',
blogTitle:'delphi
对象的释放出现内存错误问题的解决方法',
blogAbstract:'
调试情况 如果用 adoconnection:= & Tadoconnection.create(Application); adoquery1 & := & TADOQuery.Create(Application); datasource1 & := & Tdatasource.Create(Application); 的话就出错 如果用 adoconnection:= & Tadoconnection.create(Nil); adoquery1 & := & TADOQuery.Create(Nil); datasource1 & := & Tdatasource.Create(Nil); ',
blogTag:'',
blogUrl:'blog/static/44',
isPublished:1,
istop:false,
modifyTime:3,
publishTime:4,
permalink:'blog/static/44',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}Delphi的内存管理及内存泄露问题-Delphi教程
当前位置:&>&&>& &
Delphi的内存管理及内存泄露问题
Delphi的内存管理及内存泄露问题
| 来源:网络 | 关键字:
mysql在通过导入sql文件可能会出现下面二个问题:1.如果sql文件过大,会出现MySQLserverhasgoneaway问题;2.如果sql文件数据有中文,会出现乱码 解决问题:问题1:出现MySQLserverhasgoneaway问题,是因为mysql默认的max_allowed_packet变量值过小.查看目前配置showVAR
这几天因为一个程序长时间运行出现比较严重的内存泄露问题,开始关注了一下内存管理方面的东西,以前也注意内存管理,创建了对象及时释放,但总有忘了处理的情况。
在Delphi中没有自动回收机制,所以一定要及时释放使用的内存,虽然有时小的内存泄露并不会造成太大的问题。
Delphi中检测内存泄露可以使用开源的FastMM(http://sourceforge.net/projects/fastmm/),使用很简单,在工程的第一行引用FastMM4即可(注意,一定要在第一个Uses的位置),可以在调试程序时提示内存泄露情况,还可以生成报告。
在Delphi2010中,使用更加简单,只需要在工程开始的位置加上语句:
ReportMemoryLeaksOnShutdown := DebugHook&&0;
就可以了,并且在运行时不会出现提示。如果想要生成文件报告,还需要FastMM4,Delphi2010中或许有别的设置可以生成文件报告,没有找到。
可以修改FastMM4Options.inc中的参数开关来修改内存管理的相关设置。
后来在网上又发现了一个说是让Delphi支持自动垃圾回收的东东,很高兴,看了一下:
http://www./personal/Hans_Boehm/gc/
有编译好的,可以支持多种开发语言,也可以支持Delphi,于是测试了一下,发现这个程序好像只是在系统退出时进行垃圾回收,比如你有两个窗体,form1和form2,form1调用form2,而form2中创建了一个对象没有释放,则在你注销form2的时候form2中使用的对象的内存并没有释放,而是要等到程序结束,所以这种垃圾回收时机有点晚了,如果你程序有大的内存泄露会导至系统内存问题的话,这个程序并不会帮你解决这个问题。(没有详细测试,哪位大侠有经验可以指点指点& :-)&& )
所以,最好的办法还是你自己在写程序的时候一定要注意释放掉使用的内存,可以借助fastmm来帮你找可能的内存泄露。
附:FastMM的使用(转自网络)
&使用说明如下: & &
& 1.打开FastMM4的调试功能,首先在自己的project里把FastMM4放在最前面,例如: &
& & & FastMM4, &
& & & Main & in & ‘Main.pas’ & {MainForm}, &
& 再修改FastMM4Options.inc,打开全调试模式。例: &
& {$define & FullDebugMode} &
& 也可以在project中定义编译常量:FullDebugMode。同时把FastMM_FullDebugMode.dll拷贝到编译后生成的可执行程序所在目录。 &
& 再要打开内存泄漏报告:EnableMemoryLeakReporting。一般情况下是缺省打开的。 &
& 这样就打开了全调试模式,如果发生内存泄漏将会生成报告文件,如果在IDE运行的时候还会弹出一个对话框显示。报告文件类似:XXX_MemoryManager_EventLog.txt &
& 2.报告文件由两部分组成,并且是每次运行append。 &
& 第一部分是泄漏的详细内容,将每个没释放的内存块详细信息显示出来。例: &
& A & memory & block & has & been & leaked. & The & size & is: & 28 & & & {一个28字节的内存块在程序结束后没有被释放} &
& {这个内存块在分配的时候的调用堆栈,也就是Call & Stack,可以清楚看出调用函数的次序。如果是系统dll则还有相应的函数名。} &
& Stack & trace & of & when & this & block & was & allocated & (return & addresses): &
& 4028E7 &
& 4030EC &
& 406649 &
& 412365 &
& 41236E &
& 411DD3 &
& 426B45 &
& 427236 &
& 42888C &
& {这个内存类型,如果是字符串string或TObject继承的对象则会显示名称及行号。} &
& The & block & is & currently & used & for & an & object & of & class: & Unknown &
& {将内存块头256个字符显示出现,作为内容提示。} &
& Current & memory & dump & of & 256 & bytes & starting & at & pointer & address & 107BDD8: &
& 第二部分是总结性内容,例: &
& {这个小型内存块泄漏的报告,如果有大型内存块泄漏则会加一行专门提示大型内存块泄漏。} &
& This & application & has & leaked & memory. & The & small & block & leaks & are & (excluding & expected & leaks & registered & by & pointer): &
& {21-28字节的内存块泄漏,未知类型一个} &
& 21 & - & 28 & bytes: & Unknown & x & 1 &
& Note: & Memory & leak & detail & is & logged & to & a & text & file & in & the & same & folder & as & this & application. & To & disable & this & memory & leak & check, & undefine & “EnableMemoryLeakReporting”. & &
& 有了这份报告只不过了解到内存泄漏存在,但是哪里没释放就还需要更进一步地调查。 &
& 调查的目标有: &
& 1.内存块分配在哪个函数里哪段代码。 &
& 这个在报告里可以结合内容和调用堆栈来看。前256个字节可以进行分析,推测分配者,调用堆栈就直接指出了分配函数,不过是一些地址,不能直接知道函数名和代码段。这时候就需要在delphi & ide环境下查看二进制内存映像了,就是View & CPU功能。 &
& 在设定断点并停下后,可以View & CPU,在菜单View=&Debug & Window=&CPU & & 快捷键:Ctrl+Alt+C &
& View & CPU & Window: & & &
& 正中就是内存映像,而且源码也相应地标注好了,左边列的地址就是内存报告中的Call & Stack中的地址,翻页找到所对应的代码就知道哪里分配内存了。 &
& 2.检查释放内存的地方是否被调用,可以用日志或断点来调试,如果压根就没有释放内存那就补上代码,如果有却没有执行则检查一下执行条件是否正确,如果断点没起作用很可能是因为代码永远不会被执行(死代码)。 &
& 这要靠经验和调试,基本上借助IDE和内存报告就可以很好地防止内存泄漏。同时要加强测试用例,争取在测试用例中能遍历到所有的代码和大部分关键功能,这样内存泄漏报告就会更准确一点。 &
& fastmm每次在程序关闭后就会根据情况生成内存泄漏报告,如果没有弹出内存泄漏警告则恭喜你,内存管得很好。 &
& 1.内存管理不是GC自动回收内存,而是检查是否有泄漏。 &
& 2.windows系统的内存泄漏是无法检查的,仅限于应用程序内部,不过检查出系统泄漏也没办法,只能等更新了。 &
& 3.检查泄漏后要自己去检查代码补齐内存释放,报告并不能做这事
网友评论仅供其表达个人看法,并不表明网易立场。

我要回帖

更多关于 delphi adoquery 参数 的文章

 

随机推荐