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的簡單用法