VCL 中一个内存泄漏Bug

xuting 2003-02-17 11:15:37
在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.
...全文
9 14 打赏 收藏 举报
写回复
14 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
lxpbuaa 2003-02-19
BlueTrees(蜗牛) 的说法很有道理

—————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
—————————————————————————————————
  • 打赏
  • 举报
回复
BlueTrees 2003-02-18
动态数组,只能释放他的本身,比如array of TObject,数组成员实际上是一个指针,它指向了一个Object,但是动态数组释放的时候不可能释放他的成员指针指向的对象,因为这个指向可能仅仅是一个引用,如果他贸然释放了,就有可能释放了别处正在使用着的对象。

对于自动管理对象的要求,Delphi提供了TObjectList和TComponentList来处理,设置其中一个属性,就可以在自己释放的同时释放所有引用的对象,在删除时也会释放。

因此,Delphi不可能让动态数组拥有这个能力,这个能力对于他来说不是必要的,只会引起混乱,这是一个确切的内存泄漏Bug!
  • 打赏
  • 举报
回复
lxpbuaa 2003-02-18
TValueListEditor的源代码是这样的:
destructor TValueListEditor.Destroy;
begin
inherited;
FTitleCaptions.Free;
FStrings.Free;//这句已经释放了TValueListStrings,因此,如果动态数组能解决对象释放的问题,那么就不会有内存泄漏
end;

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

—————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
—————————————————————————————————
  • 打赏
  • 举报
回复
seo2002 2003-02-18
delphi 资源泄漏问题一堆,用qatime一查,有十几处,borland的开发人员根本不管。
  • 打赏
  • 举报
回复
diruser 2003-02-17
up
  • 打赏
  • 举报
回复
rwdx 2003-02-17
gz
  • 打赏
  • 举报
回复
stanely 2003-02-17
up
  • 打赏
  • 举报
回复
BlueTrees 2003-02-17
的确存在这个问题,不过通常好像用不到,这个好像是属性编辑器要用的,程序还要不受干扰,怪不得Delphi会越来越慢。
  • 打赏
  • 举报
回复
leaya11 2003-02-17
庆幸,我一般用tstrings/tstringlist,汗……
  • 打赏
  • 举报
回复
fancier 2003-02-17
关注!
  • 打赏
  • 举报
回复
墨梅无痕 2003-02-17
哎呀,简直太糟糕了,使用TValueListStrings类的TValueListEditor控件的Destroy方法也没有调用Clear方法。
上次用到了TValueListEditor,这下麻烦了。

多谢大哥了~
  • 打赏
  • 举报
回复
墨梅无痕 2003-02-17
嗯,不光D6,我查了一下,D7也是一样没有重载Destroy方法。
  • 打赏
  • 举报
回复
相关推荐
发帖
Delphi
加入

5091

社区成员

Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
申请成为版主
帖子事件
创建了帖子
2003-02-17 11:15
社区公告
暂无公告