0

DLL 内のレガシー コードを使用して、製造された製品をテストするためのアプリケーションがあります。アプリケーションは、さまざまな製品用にセットアップできます。セットアップは xml ファイルを介して行われ、実行時、つまり End-Of-Lot で変更することができます (変更する予定です)。xml の処理は、前述のレガシー dll によって行われます。

長時間 (数日から数週間) 実行した後、メモリ フットプリントが増加していることに気付きました。それをデバッグすると、(可能性のある) リークを dll に追跡することができました。ソースを取得した後、次のようなものが見つかるまでさらに調査できました。

CAObjHandle doc;
MSXML6_NewDOMDocument40IXMLDOMDocument2(0, 0, LOCALE_NEUTRAL, 0, &doc);
[...]
MSXML6_IXMLDOMDocument2load(doc, 0, vtPath, &success);

私には思えますが、これは毎回呼び出され、新しいロットが開始されます。そしてdoc、記憶の中にあるように見えるのは、この構造です。解放されている場所が見つかりません。

結局、dll には、(CVI 関数の) 解放されていないオブジェクトからの多くの小さなリークがありました。それらを修正しましたが、この MS オブジェクトを解放する方法がわかりません。私はこれに出くわしました: MSXML ガベージ コレクション メカニズムを理解していますが、ANSI-C コードを取得した後、GC をどうするか、それが機能するかどうかわかりません。

MSXML オブジェクトを手動で解放する方法はありますか?

4

1 に答える 1

0

さて、答えを見つけました。でMSXML6_*オブジェクトの割り当てを解除できますCA_DiscardObjHandle()

于 2013-05-16T10:34:59.900 に答える