私は過去に消えたこの厄介なバグを持っていましたが、かなりの時間後に戻ってきました。FastMM4は "ブロックヘッダが壊れています"と答えています
私は、(TObjectListから派生した)TAsmJobオブジェクトに作成されロードされた2つのTSamオブジェクト(TPersistentから派生したもの)を持っています。
実行時に、フォームはTStringGridを作成し、次にAsmJobを作成して2つのSAMオブジェクトを作成します(それぞれのディスクにデータをロードします)。 AsmJobもグリッドに割り当てられます。 フォームが破棄されると、Gridは解放してAsmJobを処理し、TSamオブジェクトを解放します。ここに問題があります:最初のオブジェクトは問題なく解放されますが、2番目のオブジェクトはその継承されたメソッド(Destroyデストラクタで)が呼び出されると終了します。
私はプログラム全体でFreeAndNilを使用してオブジェクトを解放します。 TSamオブジェクトはNILではありません!!!!!したがって、これはオブジェクトを解放する最初の試みです。オブジェクト内のデータさえ一貫しています。プログラムのバックボーンは、次のようになります
:私はそれが解放された後、フリーダブルまたはオブジェクトを上書きしようとするところ
**Create:**
Form -> StringGrid
-> AsmJob -> Sam1, Sam2
StringGrid.AsmJob:= AsmJob;
**Free:**
Form -> StringGrid -> AsmJob -> Sam1, Sam2
私は本当に理解していません。
編集:私が得たエラーの
一部:
FastMMが 空きブロックスキャン動作中にエラーを検出しました。 FastMM ブロックが解放された後で修正された が検出されました。
フリーブロックスキャン操作中にFastMMがエラーを検出しました。ブロック ヘッダーが破損しています。
詳細:
The current thread ID is 0x19C, and the stack trace (return addresses) leading to this error is:
402E77 [System][@FreeMem]
4068DC [System][@DynArrayClear]
405E2D [System][@FinalizeArray]
405D31 [System][@FinalizeRecord]
40432F [System][TObject.CleanupInstance]
404272 [System][TObject.FreeInstance]
404641 [System][@ClassDestroy]
4D313E [UnitSam.pas][TSam.Destroy][297]
4042BF [System][TObject.Free]
4149ED [SysUtils][FreeAndNil]
4D9C0A [UnitAsmJob.pas][UnitAsmJob][TAsmJob.Destroy][180]
私は "範囲チェック" などのIDEで有効になってすべての "デバッグ" のオプションを持っています。また、FastMM4はスーパーアグレッシブデバッグモードに設定されています。 FastMMがないと、デバッガの外にプログラムが正常に動作しますが、それでもバグがもう存在しないというわけではありません。実際、FastMMをインストールするまで(おそらく)1年以上働いていました。
編集:みんなに
感謝。いいえ、私は良い方向に少し動いていると感じています。
プログラムの構造は複雑です。元の投稿を小さく保つためにバックボーンだけを提供しました。しかし、それはすでに大きいです:) これらのTSamオブジェクトは、ディスクからデータを読み込むために使用されます。各オブジェクトに1つのファイル。彼らはまた、いくつかの処理とデータ検証を行っています。これらのTSamのそれぞれについて、私はTSamオブジェクトに含まれるデータを(グラフィックで)画面に表示するグラフィックオブジェクトも持っています。 TStringGridの各行には、TSamのデータもテキストで表示されます。私が持っている
つの質問:私はエラーがどこにあるか見つけるために小さな断片にプログラムをブレークした場合、エラーがまだ表示されますか?または、この特定の構成でのみ表示することは可能ですか?
への回答、「どのようにTStringGridはAsmJobを破壊することを、あなたは私たちを見ることができるようにAsmJobはTStringGridに割り当てられますでしょうか?」
begin
FreeAndNil(AsmJob);
inherited
end;
ありがとうアレクサンダー。私は "ScanMemoryPoolForCorruptions"について何の手がかりも持っていませんでした。私は、FastMM DLLが提供する関数だと思います。私は今それについて検索するつもりです。 – Ampere
これは、標準のFastMM4.pasからの機能です。 FastMMの完全スタンドアロン版です。 Delphiに統合されたFastMMのバージョンには存在しません。 問題のDLLはありません。これは通常のpasファイル内の単なる関数です;) – Alex
悲しいことにリンクが死んでいます。しかし、あなたはhttp://web.archive.org/web/20091007162116/http://blog.eurekalog.com/?p=198でアクセスすることができます。 – EMBarbosa