5

Delphi XE を使用しています。Delphi Soap を使用してメモリ リークの問題に遭遇しました。QC 91160TWSDLLookup.Destroyで説明されているように、 の .Free コールの欠落が原因であることが判明しました。

私が抱えている問題は、説明されている回避策でありFLookup.FreeTWSDLLookup.Destroyメソッドに追加するだけです。
Delphi ソースを変更したくないので、Tom の回答で説明されているように、ユニットをプロジェクト フォルダにコピーし、変更を加えて再コンパイルしてみました。この手法の問題点は、すべての依存ユニットも再コンパイルした場合にのみ機能するように見えることです。プロジェクト ディレクトリにコピーしようとしたところWSDLLookup.pas、Stackoverflow エラーが発生しました。私は Web サービス / SOAP に詳しくないので、この手法を使用する場合に他のどのユニットをコピーすればよいかわかりません。

同じページのRob Kennedyの回答では、コードフックを含む別の手法について説明していますが、オブジェクトメソッドには適用されないようです。私は彼が提案したとおりに実行し、TNT Unicode コントロールのフリー コードをダウンロードして、関連する手順を見つけましたが、オブジェクトのメソッドをフックする方法に関する情報を見つけることができませんでした (実際に可能である場合)。これができれば、呼び出しをフックTWSDLLookup.Destroyして追加しFLookup.Freeます。

これを修正する方法についてのアイデアは大歓迎です。私は少し初心者のプログラマーなので、明らかな何かを見逃していることを願っていますか?

4

1 に答える 1

3

あなたがやろうとしていることは、実際にはうまくいきます。私はそれを自分でテストしました。使用したプロジェクトファイルは次のとおりです。

program WSDLLookupTest;

{$APPTYPE CONSOLE}

uses
  WSDLLookup in 'WSDLLookup.pas';

var
  intf: IInterface;

begin
  intf := GetWSDLLookup as IInterface;
end.

ファイルのコピーを作成WSDLLookup.pasし、.dpr ファイルと同じディレクトリに配置しました。次に、オリジナルではなくコピーで、 を変更しましたTWSDLLookup.Destroy

destructor TWSDLLookup.Destroy;
begin
  Beep;
  ClearWSDLLookup;
  FLookup.Free;
  inherited;
end;

Beepこのコードが実際に実行されていることを証明するために、 を追加しました。

あなたの立場では、コードフックを試みる代わりに、このソリューションを間違いなく使用します。もちろん、もう 1 つの簡単な解決策は、新しい Delphi バージョンにアップグレードすることです。

注意すべきことの 1 つは、アップグレードを行うときに変更されたユニットを削除することを忘れないことです。リークは XE2 で修正されました。

于 2012-10-31T10:49:12.960 に答える