0

Delphi 5を使用して開発されたアプリケーションがありますが、ここでは重要ではない理由により、Delphi6以降にアップグレードすることはできません。

少し前に、そのアプリケーションにXML処理を実装する必要があり、Delphi6を使用して他のアプリケーション用に作成した実装をコピーすることにしました。

すべてがうまくいった。Delphi 6のソース(msxml.pas、xmldoc.pas、msxmldom.pasなど)をDelphi 5に変換しました。各ファイルに対して微調整を行う必要がありました(たとえば、Variantsの使用を削除するなど)。それは機能しましたが、メモリの解放に関していくつかの問題に直面しています。

この問題は、Delphi5とDelphi6がインターフェイスを実装する方法に関連していると思います。インターフェイスとその実装をDelphi6から5にコピーしました。Delphiがメモリを適切に解放していません。コードをデバッグすると、問題の原因はTXMLDocument.ReleaseDocXMLDoc.pasにあると判断しました。その行FDOMDocument := nilは、本来のメモリを解放していないようです。

誰かが私にこれについていくつかの助けを与えることができますか?これを修正できない場合は、別のXMLライブラリを使用してすべてを再コーディングする必要があります。

4

4 に答える 4

4

Delphi 6は、Delphi5と同じ方法でインターフェイスオブジェクトをリリースします。

Delphi5プログラムがどこでうまくいかないかを見つけるためにデバッグする必要があります。

メモリが解放されないことを示す小さなテストケースから始めます。両方のバージョンのDelphiで実行して、問題がDelphi5でのみ発生することを確認します。

可能であれば、Delphi6テストケースでもDelphi5バージョンのXMLライブラリを使用してください。そうしないと、ライブラリをDelphi5に翻訳したときに自分で問題を引き起こしたのではないかどうかを確認できません。

于 2012-04-17T21:41:49.817 に答える
3

どちらの場合も実際にはインターフェイスであることを再確認してくださいFDOMDocument。そうでない場合、'FDOMDocument:= nil'は、オブジェクト参照の場合はリークするだけです。

FDOMDocumentまた、 ReleaseDocがそれを解放するのを妨げる 別の参照を保持していないことも確認してください。

特に、インターフェイスの循環参照に注意してください。

于 2012-04-18T02:14:23.703 に答える
1

fDOMDocumentに追加の参照が他の場所に保持されているかどうかを確認できます。fDOMDocument:= NILを設定する直前に、

references := fDOMDocument._AddRef ;
fDOMDocument._Release ;

「参照」が1より大きい場合は、インターフェースへの参照を保持している他の変数を検索する必要があります。

于 2012-04-18T17:00:30.770 に答える
1

どうもありがとう...

なぜそうしたのかわかりませんが、Delphi6ファイルをDelphi5にコピーしているときに、行を変更しました

Result := inherited _Release;Result := 0; //inherited _Release;

の上function TXMLNode._Release: Integer;

元に戻しました。テストされ、Delphi5プログラムはDelphi6と同じように実行を開始しました...

お時間をいただき、ありがとうございました!

于 2012-05-24T18:50:40.680 に答える