0

いくつかのオブジェクトを格納する TList があります。これで、そのリストに対していくつかの操作を行う関数ができました。

function SomeFunct(const AIndex: integer): IInterface
begin
if (AIndex > -1) and (AIndex < fMgr.Windows.Count ) then
  begin
    if (fMgr.Windows[AIndex] <> nil) then
      begin
        if not Supports(TForm(fMgr.Windows[AIndex]), IMyFormInterface, result) then
          result:= nil;
      end;
  end
else
  result:= nil;
end;

今、本当に奇妙なのは、適切なインデックスで fMgr.Windows にアクセスすると EListError が発生することです... 私はそれをデバッグしようとしましたが、関数は引数0と1で2回呼び出されます(想定どおり)。

AIndex = 0 の場合、fMgr.Windows[AIndex] を評価すると $someAddress で EListError が発生しますが、代わりに fMgr.Windws[0] を評価すると、適切な結果が返されます ...

さらに奇妙なことに、EListError があったとしても、関数は適切なデータを返します...そして何も表示しません。シャットダウン時の 2 つの EListError メモリ リークに関する情報のみ (FastMM を使用)

何が間違っているのでしょうか?

前もってありがとうミハル

4

2 に答える 2

1

何らかの方法でデバッガーを混乱させているだけだと思います。プロパティを参照するウォッチがあり、そのウォッチを評価すると例外が発生すると、「クリーン」でリークのないコードがメモリ リークを生成するように見えることがあります。これらは、デバッガーによって処理される IDE には表示されません。

これが発生する可能性があるのは、Aindex が初期化される前に fMgr.Windows[AIndex] を表示するデバッガーがある場合、またはリストにアイテムが存在する前に fMgr.Windows[0] を監視している場合です。

于 2009-12-28T06:45:47.077 に答える
0

インデックスが正しい場合に EListError をスローする理由はありません。例外がスローされた場合、例外が表示されずに通常の結果が返される理由はありません。

残念ながら、この小さな情報では何が問題なのかを理解するのは難しいため、推測することしかできません。

マルチスレッドの問題が発生している可能性がありますか?例外がスローされる可能性がありますが、デバッガーはブレークポイントで停止しませんか? たぶん、リークはこのコードからではありませんか?もしかして虚偽のリーク情報?おそらくfMgrは何か違うものを参照していますか?もしかして事実が違う?

より多くのデバッグ情報をオンにして FastMM レポート コールスタックを作成するか、デバッグ DCU を使用してコンパイルして TList コードをトレースすることができます。そして、Delphi がすべての例外で停止することを確認してください。多分それはあなたの問題を見つけるのに役立つでしょう。

于 2009-12-27T18:07:34.987 に答える