Delphi 11.3程序UnicodeString内存泄漏问题排查与解决
Delphi 11.3 UnicodeString内存泄漏排查与解决(Indy10 AIS解码程序场景)
问题背景
用Delphi 11.3编译的Windows小型AIS船舶交通解码程序,基于Indy10组件(TCPServer、TCPClient、UDPServer)实现数据接收处理。程序运行一天后关闭时,内存泄漏报告显示:
- 25-40字节:UnicodeString ×235939
- Unknown ×2
由于未手动创建过UnicodeString,初步怀疑泄漏点为:
- 存在未调用
Free的TStringList实例 - Indy10组件自身的内存管理问题
排查过程更新
进一步聚焦Delphi标准String未被正常释放的场景:
程序通过3个Indy10输入源接收数据,将包含String字段的自定义TRecord通过PostMessage发送至主线程,且已对TRecord指针调用Dispose。排查AIS解码逻辑代码片段未发现明显问题。
最终原因与解决方法
泄漏的UnicodeString属于某自定义TRecord,问题出在**每次处理新数据前用FillChar清空该TRecord**的操作:FillChar会直接覆盖TRecord的内存区域,破坏了其中UnicodeString的引用计数信息,导致内存管理器无法识别该String需要被释放,最终引发大量内存泄漏。
移除FillChar清空TRecord的操作后,内存泄漏问题彻底解决。
内容的提问来源于stack exchange,提问作者Bart Kindt
相关产品推荐
相关产品推荐

