在valedit.pas中,TValueListStrings类没有实现虚拟的Destroy方法,
它实现了虚拟的Clear方法, 但是它的父类TStringList的
Destroy中并不通过调用Clear()来释放资源,因此TValueListStrings
中为成员ItemProps分配的内存就丢失了.所以如果在Form中添加了TValueListEditor控件,并且在代码中
使用了其ItemProperty成员(因为它是延迟分配,只有第一次使用时才分配内存),
则需要在Form.Destroy()方法中显式的调用Clear()方法,如下:MyForm.Destroy()
{
...
MyValueListEditor->Strings->Clear();
...
}我是在C++ Builder 6的VCL Source中发现的, 估计 Delphi 6中
也应该有这个Bug.
它实现了虚拟的Clear方法, 但是它的父类TStringList的
Destroy中并不通过调用Clear()来释放资源,因此TValueListStrings
中为成员ItemProps分配的内存就丢失了.所以如果在Form中添加了TValueListEditor控件,并且在代码中
使用了其ItemProperty成员(因为它是延迟分配,只有第一次使用时才分配内存),
则需要在Form.Destroy()方法中显式的调用Clear()方法,如下:MyForm.Destroy()
{
...
MyValueListEditor->Strings->Clear();
...
}我是在C++ Builder 6的VCL Source中发现的, 估计 Delphi 6中
也应该有这个Bug.
上次用到了TValueListEditor,这下麻烦了。多谢大哥了~
TValueListEditor.Strings实际上是TItemProps = array of TItemProp类型。也就是说是一个对象数据的动态数组。或许Delphi的动态数组释放时会释放其中的对象,这点我不敢肯定。—————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
—————————————————————————————————
destructor TValueListEditor.Destroy;
begin
inherited;
FTitleCaptions.Free;
FStrings.Free;//这句已经释放了TValueListStrings,因此,如果动态数组能解决对象释放的问题,那么就不会有内存泄漏
end;—————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
—————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
—————————————————————————————————