关于Delphi字符串内存泄露的问题
2016-04-07 12:35
459 查看
最近在写游戏中的排行榜系统,在测试的时候发现一个问题,在所有对象都完全释放的前提下,仍然存在少量的内存泄露问题。
在多次定位之后,发现问题出现在一个很奇怪的地方。
Class.StrValue = Sql.FieldByName('').asString; 如果执行了这句话,最后就会存在泄露
Class.IntValue = Sql.FieldByName('').asInteger;执行这句话,就不会存在泄露
对同一个对象的字符串类型和数值类型赋值,当赋值对象是string类型时,居然存在内存泄露的问题?很是好奇。
后来研究了一下,发现了问题所在,其原因在于两个地方:
1.Delphi的string类型时一个智能指针,只有当引用计数为0的时候,才会释放该内容;
2.Delphi的FillChar方法,要比智能指针低级,并不会出发智能指针的引用计数的变更;
而我在编写程序的过程中,确实存在直接使用FillChar方法将对象清空的操作。也正是因为这个操作,导致的内存空间中的string对象的引用计数没有被正确的清空。因此,每次执行都会残留少量的string对象在内存中,当游戏实际运行起来,在压力测试中,就会体现出内存泄露的问题了。
解决办法就是,在执行FillChar方法前,先执行 StrValue = ‘’ 来修改对应智能指针的引用计数,从而实现对内存的正确释放!
在多次定位之后,发现问题出现在一个很奇怪的地方。
Class.StrValue = Sql.FieldByName('').asString; 如果执行了这句话,最后就会存在泄露
Class.IntValue = Sql.FieldByName('').asInteger;执行这句话,就不会存在泄露
对同一个对象的字符串类型和数值类型赋值,当赋值对象是string类型时,居然存在内存泄露的问题?很是好奇。
后来研究了一下,发现了问题所在,其原因在于两个地方:
1.Delphi的string类型时一个智能指针,只有当引用计数为0的时候,才会释放该内容;
2.Delphi的FillChar方法,要比智能指针低级,并不会出发智能指针的引用计数的变更;
而我在编写程序的过程中,确实存在直接使用FillChar方法将对象清空的操作。也正是因为这个操作,导致的内存空间中的string对象的引用计数没有被正确的清空。因此,每次执行都会残留少量的string对象在内存中,当游戏实际运行起来,在压力测试中,就会体现出内存泄露的问题了。
解决办法就是,在执行FillChar方法前,先执行 StrValue = ‘’ 来修改对应智能指针的引用计数,从而实现对内存的正确释放!
相关文章推荐
- Delphi实现http发送xml文件片段
- Delphi实现毫秒级别的倒计时实例代码
- Delphi7中Listview的常用功能汇总
- 插件管理框架 for Delphi(一)
- delphi中一个值得大家来考虑的DLL问题
- Delphi实现检测并枚举系统安装的打印机的方法
- delphi 正弦曲线图
- Delphi下OpenGL2d绘图之画四边形的方法
- Delphi实现木马文件传输代码实例
- delphi建立、读取、存贮INI文件的方法《三》
- Delphi控件ListView的属性及使用方法详解
- delphi制作wav文件的方法
- Delphi下OpenGL2d绘图之画点的方法
- Delphi下OpenGL2d绘图之初始化流程详解
- Delphi实现窗体感知鼠标滑过并自动隐藏与显示窗口的方法
- Delphi实现截屏存盘的方法
- Delphi实现碰撞球体完整实例代码
- delphi建立、读取、存贮INI文件的方法《二》
- Delphi解析FTP地址的方法
- Delphi实现读取系统时间与日期完整实例