1

TinyXMLを使用してロードしている200 MBのXML ファイルがあります。私の問題は、TinyXML オブジェクトが破棄されると、それが使用したメモリが再利用されないことです。他のプロジェクトで使用したメモリ リーク検出器を使用し、手動でコードをステップ実行しましたが、メモリ リークを見つけることができなかったので、メモリ リークが問題であるとは思えません。

このコードは問題を再現します:

#include <iostream>
#include <tinyxml.h>

int main()
{
    char* filename = "../LargeFile.xml";

    {
        TiXmlDocument targetDoc( filename );
        targetDoc.LoadFile();
    }

    char* buf = new char[ 524288000 ];
    delete [] buf;

    return 0;
}

Address Space Monitorを使用LoadFile()すると、赤色の大きなチャンクができた後、targetDoc破棄された後はすべて黄色になっていることがわかります。次に、最終的な char buf が割り当てられると、TinyXML から解放された黄色ではなく、赤色で表示されますが、緑色のスペースの上に表示されます。緑のアドレス空間よりも多くのバッファーを割り当てようとすると、アプリケーションがクラッシュします (メモリ不足)。これは下の画像で見ることができます。

ロード後 アンロード後 文字バッファーの割り当て

アドレス スペース モニター ページによると、「空きアドレス スペースは緑、予約済みアドレスは黄色、使用済み (コミット済み) メモリ領域は赤で表示されます」では、アドレス スペース モニターによると、TinyXML によって解放されたメモリが「予約済み」のままなのはなぜですか。何が原因で、どうすればそれを止めることができますか?

編集:

「大きなバッファを割り当てていますか? もしそうなら、黄色のスペースにメモリの断片化があり、大きな連続したバッファを割り当てることができる場所がない可能性があります」

素晴らしい質問ですが、これは TinyXML にメモリ リークがあり、私のツールのどれもそれを示していないことを示しています。

アップデート

int を無限に割り当てるループを作成しましたが、最終的にはすべての黄色のスペースを使用しているように見えました。ただし、より大きな割り当てでは使用されません。これは、tinyXML による xml ファイルの解析中にヒープに小さなリークが散らばっていたことを示していました。tinyXML は、リークの間に収まるのに十分小さいオブジェクトのみを黄色のスペースに割り当てることができるようにヒープを断片化します。 . そのため、TinyXML のリークをより長く検索しましたが、まだ何も見つかりませんでした。すべてが正しく解放されているようで、最初の混乱状態に戻りました。

私はその問題を説明するのに途方に暮れています。

文字バッファーの割り当て 文字バッファ割り当て2 文字バッファ割り当て3

4

2 に答える 2