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
相关产品推荐
相关产品推荐

