You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi含StringList的类释放时内存泄漏,析构函数未调用如何解决?

问题原因与解决方案

你的内存泄漏根源是TKeywords类的析构函数没有声明为override。

Delphi中TObject的Destroy是虚方法,子类要重写这个方法必须显式加上override关键字。如果没加,调用Free时只会执行父类TObject的Destroy逻辑,完全不会触发你写的子类析构代码——这就是为什么你看到执行了Keywords.Free但析构函数没被调用的原因。最终导致fIncludes(TStringList)没被释放,连带它存储的UnicodeString也泄漏。

修改后的关键代码

只要给析构函数加上override关键字即可:

Type
  TKeywords = Class(TObject)
    // ... 其他成员不变 ...
    public
      constructor Create;
      destructor Destroy; override; // 新增override关键字
      procedure Execute(pFileName: String);
      // ... 属性声明不变 ...
  end;

// 析构函数实现不变,只需确保声明部分加了override
Destructor TKeywords.Destroy;
begin
  fIncludes.Free;
  inherited Destroy;
end;

说明

  • 加上override后,调用Keywords.Free时会正确触发子类的析构函数,释放fIncludes对象,解决TStringList的泄漏。
  • fIncludes中存储的UnicodeString由TStringList管理,当TStringList被正确释放时,这些字符串会自动被回收,因此UnicodeString的泄漏也会随之解决。

内容的提问来源于stack exchange,提问作者John Barrat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 17:25:28