| 導購 | 订阅 | 在线投稿
分享
 
 
 

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

2007-03-16 11:14:41  編輯來源:互聯網  简体版  手機版  評論  字體: ||
 
  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的內存了。
 
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的內存了。
󰈣󰈤
 
 
 
>>返回首頁<<
 
 
 
 
 熱帖排行
 
王朝網路微信公眾號
微信掃碼關註本站公眾號 wangchaonetcn
 
  免責聲明:本文僅代表作者個人觀點,與王朝網絡無關。王朝網絡登載此文出於傳遞更多信息之目的,並不意味著贊同其觀點或證實其描述,其原創性以及文中陳述文字和內容未經本站證實,對本文以及其中全部或者部分內容、文字的真實性、完整性、及時性本站不作任何保證或承諾,請讀者僅作參考,並請自行核實相關內容。
 
© 2005- 王朝網路 版權所有