2012-04-17 8 views
0

Delphi 5を使用して開発されたアプリケーションがありますが、ここでは重要ではないいくつかの理由でDelphi 6以降にアップグレードすることはできません。なぜDelphi 6のMSXMLライブラリはDelphi 5でメモリをリークしますか?

しばらく前に私たちは、そのアプリケーションにXML処理を実装しなければならなかった、と私たちは

すべてがうまくいったのDelphi 6を使用して他のアプリケーションのために作られた実装をコピーすることを決めました。 Delphi 6のソース(msxml.pas、xmldoc.pas、msxmldom.pasなど)をDelphi 5に翻訳しました。各ファイルでマイナー調整を実行する必要がありました(Variantsの削除など)。それはうまくいったけど、私はメモリ解放に関するいくつかの問題に直面している。

私は問題がデルファイ5とDelphi 6、インターフェイスを実装する方法に関連していると信じています。私は、インターフェイスとその実装をDelphi 6から5にコピーしました.Delphiはメモリを適切に解放していません。コードのデバッグでは、問題の原因がXMLDoc.pasのTXMLDocument.ReleaseDocにあると判断しました。行FDOMDocument := nilのように見えるメモリが解放されていません。

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

+0

もう1つ...コードのデバッグでは、問題の原因が** XMLDoc.pas **のTXMLDocument.ReleaseDoc **上にあることがわかりました。 'FDOMDocument:= nil;'という行のように見えるメモリが解放されていません。 – zedmartins

+0

ようこそスタックオーバーフロー。コメントに新しい情報を追加するのではなく、質問を編集して新しい情報をそこに入れることができます。 –

答えて

1

おかげでたくさんの男...

私がやった理由を私は知りませんが、デルファイ5にデルファイ6ファイルをコピーしている間、私は Result := 0; //inherited _Release;

にライン

Result := inherited _Release; を変更

オンfunction TXMLNode._Release: Integer;

変更されました。テストされ、Delphi 5プログラムはDelphi 6のように動作し始めました...

もう一度お時間をありがとう!

4

デルファイ6のリリースでは、オブジェクトをデルファイ5と同じ方法をインターフェース。

あなたのデルファイ5プログラムが間違ってどこに行くかを見つけるためにデバッグする必要があります。メモリが解放されないことを実証している小規模なテストケースと

スタート。問題はデルファイ5.

可能な場合に展示されていることを確認するためのDelphiの両方のバージョンでそれを実行して、あまりにも、デルファイ6テストケースにXMLライブラリのあなたのデルファイ5バージョンを使用します。それ以外の場合は、ライブラリをDelphi 5に翻訳したときに、自分で問題を紹介していないことを確認することはできません。

+2

"可能であれば、Delphi 6のテストケースでも、XMLライブラリ のDelphi 5バージョンを使用してください。 Sageのアドバイス、+1 –

3

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

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

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

+0

+1、特に循環参照警告の場合。 –

+0

+1:Marjan Venemaと完全に同意してください! – menjaraz

1

あなたはfDOMDocumentは、他の場所で開催された追加の参照を持っているかどうかを確認することができます:ちょうどfDOMDocument設定する前に:「参照」は1より大きいが、あなたが保持する他の変数を探して行く必要がある場合= NILは、

references := fDOMDocument._AddRef ; 
fDOMDocument._Release ; 

を行いますインタフェースへの参照。

関連する問題