在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.

解决方案 »

  1.   

    嗯,不光D6,我查了一下,D7也是一样没有重载Destroy方法。
      

  2.   

    哎呀,简直太糟糕了,使用TValueListStrings类的TValueListEditor控件的Destroy方法也没有调用Clear方法。
    上次用到了TValueListEditor,这下麻烦了。多谢大哥了~
      

  3.   

    庆幸,我一般用tstrings/tstringlist,汗……
      

  4.   

    的确存在这个问题,不过通常好像用不到,这个好像是属性编辑器要用的,程序还要不受干扰,怪不得Delphi会越来越慢。
      

  5.   

    delphi 资源泄漏问题一堆,用qatime一查,有十几处,borland的开发人员根本不管。
      

  6.   

    楼主讲的没有显示调用Clear,的确是这样的。但是
    TValueListEditor.Strings实际上是TItemProps = array of TItemProp类型。也就是说是一个对象数据的动态数组。或许Delphi的动态数组释放时会释放其中的对象,这点我不敢肯定。—————————————————————————————————
    宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
    —————————————————————————————————
      

  7.   

    TValueListEditor的源代码是这样的:
    destructor TValueListEditor.Destroy;
    begin
      inherited;
      FTitleCaptions.Free;
      FStrings.Free;//这句已经释放了TValueListStrings,因此,如果动态数组能解决对象释放的问题,那么就不会有内存泄漏
    end;—————————————————————————————————
    宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
    —————————————————————————————————
      

  8.   

    动态数组,只能释放他的本身,比如array of TObject,数组成员实际上是一个指针,它指向了一个Object,但是动态数组释放的时候不可能释放他的成员指针指向的对象,因为这个指向可能仅仅是一个引用,如果他贸然释放了,就有可能释放了别处正在使用着的对象。对于自动管理对象的要求,Delphi提供了TObjectList和TComponentList来处理,设置其中一个属性,就可以在自己释放的同时释放所有引用的对象,在删除时也会释放。因此,Delphi不可能让动态数组拥有这个能力,这个能力对于他来说不是必要的,只会引起混乱,这是一个确切的内存泄漏Bug!
      

  9.   

    BlueTrees(蜗牛) 的说法很有道理—————————————————————————————————
    宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
    —————————————————————————————————