3


1

VirtualTreeviewとOTLを使用したメモリリーク

小さなマルチスレッドアプリケーションを作成し、OmniThreadLibraryを使用するように変換しようとしています。 Virtualtreeviewを使用して、ログとステータス/結果を表示しています。 Vstログには2つの列のみがあり、レコードには2つの文字列フィールドのみが含まれます(非常に単純で、レコード内にオブジェクトはありません)。

OTLに付属するDEMOプロジェクト(スレッドプール#11)を使用して、リストボックスの代わりにVirtualTreeviewを使用するようにプロジェクトを変更しました。 デモから「タスクを実行」するとメモリリークは発生しませんが、「タスクを実行」を複数回実行するとメモリリークが発生します。 タスクを複数回実行すると、メモリリークが発生します。 VirtualTreeViewをまったく使用しない場合、いつでもメモリリークは発生しません。 VSTを使用するときと、タスクが複数回実行されるときだけです。

私はFreeNodeイベントを使用して文字列をクリアし、Finalizeを使用してみました…​

例:

procedure TFormMain.vstLogFreeNode(Sender: TBaseVirtualTree;
  Node: PVirtualNode);
var
  LogData: PTreeLogData;
begin
  LogData:=Sender.GetNodeData(Node);

  if Assigned(LogData) then begin
    LogData^.Msgtype := '';
    LogData^.Msg := '';
  end;
  //Finalize(LogData^);

end;

タスクを複数回実行するとメモリリークが発生するのはなぜですか? FastMM4の最新のVirtualtreeviewとOTLを備えたDelphi 2010

3 Answer


10


NodeFreeイベントは、* Validated *ノードに対してのみ呼び出されます。通常、検証されるのは、1回以上(GetTextイベントが呼び出されたとき)表示されるノードを意味します。 http://www.remkoweijnen.nl/blog/2010/06/09/memory-leaks-when-using-virtual-treeview-component/ [仮想ツリービューコンポーネント使用時のメモリリークを参照]

編集:ノード数を確認し、NodeFreeイベントが呼び出された回数をカウントすることで確認できます。


4


なぜそれが具体的に起こっているのかはわかりませんが、FastMMのFullDebugModeを有効にする方法を知っています。 (このためには、SourceForgeからFastMMフルバージョンをダウンロードする必要があります。)ファイルでメモリリークレポートを提供するオプションをオンにし、プロジェクトが詳細なマップファイルを生成していることを確認します。 この設定が完了すると、FastMMはポップアップウィンドウだけでなく、スタックトレースを備えた非常に詳細なメモリリークレポートを提供します。 これは、何が起こっているかを絞り込むのに役立ちます。


1


メイソンが言ったように、http://sourceforge.net/projects/fastmm/ [FastMM4]はあなたの友達です。 あなたはこのCodeRage 2セッションを見たいと思うかもしれません:http://video.codegear.com/CodeRageIIArchives/Day4/FrancoisGaillard_MemoryLeaks_English.zip [ダミーのためのメモリリークとの戦い]。 これは主に、DelphiでFastMMを使用してメモリリークを防止または検出する方法を示しています。 D2007用でしたが、それでも関連性があります。

経験から、2回実行するとリークするのに1回実行しないのは、主に、割り当てられているかどうかを最初に確認せずにField / Variableにオブジェクトを作成して保存したためです。 次のように構築します。

TSomething
FMyObject: TMyObject;
[..]

TSomething.Destroy;
begin
  FMyObject.Free;
end;
[...]

//somewhere in code:
FMyObject := TMyObject.Create; //leaks the previous FMyObject

明らかにそれほど単純ではなく、おそらくいくつかのセッターまたは何らかの種類のリスト/コンテナを通じて隠されています…​ ここでは、チェックせずにVirtualTreeViewに追加すると思います…​