この行の場合:ClientCommunication.Free;
例外が発生しています。ここでできることがいくつかあります。
FreeAndNilへの呼び出しを への呼び出し
に置き換えます。
解放するだけでは、古いポインターは非 nil 参照のままであり、解放されたオブジェクトとアクティブなオブジェクトを区別できません。 AObject.free
freeandnil(AObject)
Assigned(AObject)
クローンに注意し
てください 犯す可能性のあるもう 1 つの間違いは、次のようにオブジェクトをクローンしたことです。
Object1:= TObject1.Create;
//.... lots of code
Object2:= Object1;
//.... lots of code
FreeAndNil(Object2); <<-- freeing the clone-reference is a mistake
//.... lots of code
Object1.Free; <<-- exception: it's already freed
FastMM4 オプション
最新の FastMM4 を http://sourceforge.net/projects/fastmm/
からダウンロードします
。これには、Delphi に含まれているものとは別の追加機能がいくつかあります。(*)
これらの機能の中には、プログラムを停止させる追加の診断モードがあります。遅いですが、あなたが苦しんでいると思われる多くのヒープ破損バグも見つけます.
開いてdefines.inc
これを変更します:
{$ifdef DEBUG}
{.$define EnableMemoryLeakReporting}
{.$define FullDebugMode}
{.$define RawStackTraces}
{$endif DEBUG}
この中に
{$ifdef DEBUG}
{$define EnableMemoryLeakReporting}
{$define FullDebugMode}
{$define RawStackTraces}
{$define CatchUseOfFreedInterfaces} <<-- very useful
{$define LogMemoryLeakDetailToFile}
{$define LogErrorsToFile}
{$define CheckHeapForCorruption} <<-- :-)
{$endif}
ここに素晴らしい記事があります
: http://wiert.me/2009/07/29/delphi-fastmm-using-fastmm4-for-debugging-your-memory-allocations-part-1-introduction/
inc ファイルをいじるように、それを行う小さなユーティリティがあります: http://jedqc.blogspot.com/2007/07/new-fastmm4-options-interface.html
(*) Delphi にもほとんどのデバッグ機能があると思いますが、100% 確実ではありません。いずれにせよ、最新 (最高) のバージョンを入手することは問題ありません。
またはバッファオーバーフローオブジェクトに何らかの内部構造がある場合、 free は余分な作業を行います
。ClientCommunication
次のコードを想像してください。
TUnrelatedObject = class
buffer: array[0..99] of integer;
procedure DoWork;
end;
TUnrelatedObject.DoWork;
var
i: integer;
begin
for i:= 0 to 100 do buffer[i]:= maxint; <<-- buffer overrun
end;
それがヒープのClientCommunication
すぐ隣にあると想像してください。
を呼び出すと、のデータも上書きされます。
これにより、DoWork でアクセス違反が発生する場合と発生しない場合があります。そうでない場合、エラーはまったく関係のない別の場所に表示されるため、追跡が非常に困難になります。 UnrelatedObject
DoWork
ClientCommunication
アプリケーションで範囲チェックを有効{$R+}
にします。
警告デバッグ バージョンをクライアントに出荷
しないように注意してください。
すべてのデバッグを行うと、プログラムは非常に遅くなります。