Delphi中使用ListView和TreeView的Item中的Data可能被忽略的内存泄漏

Delphi中大家在使用 ListView和TreeView时,一般都会使用到Item的Data属性来保存大家自己的内部数据,这个Data的声明如下:

property Data: Pointer;

大家可以看到它就是一个指针,使用上一般类似如下代码(以ListView为)

添加时

PViewItemState = ^TViewItemState;

TViewItemState = record

ViewItemId: integer;

end;

var

nLoop: integer;

li: TListItem;

pp: PViewItemState;

begin

for nLoop := 0 to 10 do

begin

li := ListView1.Items.Add;

li.Caption := IntToStr(nLoop);

new(pp);

pp^.ViewItemId := nLoop;

li.Data := pp;

end;

end;

删除相应的项时多数采用

ListView1.DeleteSelected; 或

ListView1.Clear;

就结束了操作。

但是这里存在非常大的危险,就是我们的自己分配的Data内容有没有释放,Delphi文档中也没有关于这个问题的说明,所以我做了一个测试,发现Delphi是不自动释放这些数据的,这些未释放的数据在一个包含较多修改的ListView或者TreeView中将非常危险,如果是长期运行的系统将更危险,Delphi文档中也没有提示这些数据需要释放。

其实这个问题容易被大家忽略,解决办法还是有的,而且也不难,这里就要使用到ListView或者TreeView的OnDeletion事件,Delphi中关于OnDeletion的说明如下:

Occurs when an item in the list view is about to be deleted.

Delphi syntax:

property OnDeletion: TLVDeletedEvent;

C++ syntax:

__property TLVDeletedEvent OnDeletion = {read=FOnDeletion, write=FOnDeletion};

Description

Write an OnDeletion event handler to respond when an item in the list is about to be deleted. The Item parameter is the TListItem object from the Items property that is about to be deleted.

也就是说当需要删除项目时会触发这个事件,在VCL Source 中也可以看到调用过程,其实解决方法就是在这个事件中加入一个语句就可以了,并且是不可以缺少的语句,代码如下:

procedure TForm1.ListView1Deletion(Sender: TObject; Item: TListItem);

begin

Dispose(Item.Data);

end;

这样就可以安全的释放掉Data的内存了。

· 把年龄相仿的狮虎熊放一起,谁更厉害?结果出人意料

很多人都想知道狮子、老虎和熊打起来谁最厉害,于是便有好事之人把这三种动物关在一起...

· 湖北宜昌三峡坝区水面惊现神秘动物

近日,湖北宜昌,一段视频在当地热传:有网友在三峡坝区拍到神秘动物,体型硕大数米长...

· 什么是语段?语段的类型以及和句群、段落的区别与联系是什么?

句群是最高级的语言单位。 段落(自然段)是章法单位...

 
使用PostMessage(WM_QUIT)退出程序时导致的内存泄漏!
信息产业部电子第30研究所 魏刚 我最近在程序开发中发现我的一个程序运行一段时间以后,就会导致系统崩溃,初步分析以后,得出得结论是有内存泄漏。...查看完整版>>使用PostMessage(WM_QUIT)退出程序时导致的内存泄漏!
 
简单使用Delphi中的TO-DO List
Delphi是一款强大的编程工具,她的优点不仅仅是提供了一个非常强大的代码编译器,Delphi本身还是一个非常好用的编辑工具。TO-DO List就是一项非常好用的功能。采用她可以让我们很清楚的了解以前完成了那些任务,还有...查看完整版>>简单使用Delphi中的TO-DO List
 
如何选中其他程序ListView控件中的某个Item
如何选中其他程序ListView控件中的某个Item 作者: 一:程序说明: 题目是一位网友在我留言板上的留言,不知道大家看没看过我曾经写过的一文?在那篇拙文中,我的目的是得...查看完整版>>如何选中其他程序ListView控件中的某个Item
 
《如何选中其他程序ListView控件中的某个Item》
《如何选中其他程序ListView控件中的某个Item》==============================================================================================             《如何选中其他程...查看完整版>>《如何选中其他程序ListView控件中的某个Item》
 
listview和treeview的简单用法
listview和treeview的简单用法listview添加数据.void __fastcall TForm1::Button2Click(TObject *Sender) //加入数据{static int i;TListItem *listitem;listitem=ListView1->Items->Add();listitem->Cap...查看完整版>>listview和treeview的简单用法