3

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

OTL (スレッド プール #11) に付属する DEMO プロジェクトを使用して、リストボックスの代わりに 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

4

3 に答える 3

11

NodeFree イベントはValidatedノードに対してのみ呼び出されます。validated は通常、(GetText イベントが呼び出されたときに) 1 回以上表示されるノードを意味します。仮想 TreeView コンポーネントを使用する場合のメモリ リークを参照してください。

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

于 2010-10-14T06:16:38.133 に答える
4

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

于 2010-10-13T18:39:00.760 に答える
1

メイソンが言ったように、FastMM4はあなたの友達です。この CodeRage 2 セッションをご覧になることをお勧めします:ダミーのためのメモリ リークとの戦い。主に、FastMM を使用して Delphi でメモリ リークを防止/検出する方法を示します。D2007用でしたが、まだ関連しています。

2 回実行するとリークが発生し、1 回実行されない理由については、経験上、オブジェクトが割り当てられているかどうかを最初に確認せずにフィールド/変数にオブジェクトを作成して格納し、以前の参照をリークしたことが主な原因です。次のように構築します。

TSomething
FMyObject: TMyObject;
[..]

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

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

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

于 2010-10-13T23:02:52.133 に答える