DOMを使用してXMLを解析するプログラムを作成しています。
//↓↓↓↓以下コーディング
MSXML2::IXMLDOMDocument2Ptr pDoc;
//pDocはクラスのメンバ変数で、初期化処理で
//以下の処理を行っています。
pDoc.CreateInstance(_uuidof(MSXML2::DOMDocument40));
pDoc->put_async(VARIANT_FALSE);
pDoc->validateOnParse = FALSE;
HRESULT hr;
hr = pDoc->load(_variant_t(szFileNameXml.c_str()));
//↑↑↑↑以上
タスクマネージャーでメモリを監視していたのですが、上記の処理が終了した
時点でメモリが解放されていないようです。
IXMLDOMDocument2PtrはCOMのインターフェースに特化したスマートポインタ
で、メモリの解放を自動で行ってくれると思っていたのですが処理が終わってもメモリが減りま
せんでした。
そこで、明示的にpDoc.Release();を最後に入れてみたのですが状況は変わりませんでした。
原因がまだ不明なので、ご存知でしたら原因と対策方法をご教示ください。
宜しくお願い致します。
スマートポインタなどに限らず、一般的なヒープの扱いとして、
new で確保したメモリを delete しても即座に OS にメモリを解放するとは限りません。
コンパイラは再利用などを目的に、プロセス終了まで保持し続けるコードを
吐いたりします。内部実装は分かりませんが、このような挙動かも知れません。
> タスクマネージャーでメモリを監視していたのですが、
タスクマネージャで見えるメモリは OS からみた確保サイズであり、
ヒープ上のキャッシュ等は考慮できませんから、
そういうメモリは単に解放されていない=確保中としてカウントされます。
勿論メモリがリークしている可能性がないわけではありませんが、
タスクマネージャでこれを確認することはできないものと思います。
# もしかすると CoUninitialize とかすれば解放されるかも。
コード全てが載ってないので、推測でしかありませんが・・・
MSXML2::IXMLDOMDocument2Ptr pDocを何か他のポインタにコピーしたりとかしてません
か?
pDocの参照カウントが0になっていないとか・・・。
comのスマートポインタは、スマートポインタのコピーが発生している場合、全てのポイ
ンタがdeleteされるまで解放されない仕組みだったと思います。
あと解放のタイミングですが、デバッガなどでメモリダンプを見ていると、
解放のタイミングでDOMツリー全てが解放されるわけではなく、スコープを抜けると
deleteされる・・というのはちょっと当てはまらないみたいです。
どの時点で解放されるか見てみるといいかもしれません。