3

定期的にいくつかのリアルタイム データを XML ファイルにダンプするモジュールを作成しました。ファイルを保存するために、最終的にxmlSaveFormatFileEnc()を使用しています。

しかし、API xmlSaveFormatFileEnc( ) を使用して Valgrind でメモリ リーク レポートを取得しています。

リークの概要は次のとおりです。

==8355== 261,507,768 bytes in 506,798 blocks are definitely lost in los s
record 109 of 109
==8355==    at 0x402BE68: malloc (in
/usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==8355==    by 0x40E43FB: xmlGetGlobalState (in
/usr/lib/i386-linux-gnu/libxml2.so.2.7.8)
==8355==    by 0x40E3A22: __xmlIndentTreeOutput (in
/usr/lib/i386-linux-gnu/libxml2.so.2.7.8)
==8355==    by 0x414BE54: ??? (in /usr/lib/i386-linux-gnu/libxml2.so.2.7.8)
==8355==    by 0x414C598: ??? (in /usr/lib/i386-linux-gnu/libxml2.so.2.7.8)
==8355==    by 0x414BE42: ??? (in /usr/lib/i386-linux-gnu/libxml2.so.2.7.8)
==8355==    by 0x414C598: ??? (in /usr/lib/i386-linux-gnu/libxml2.so.2.7.8)
==8355==    by 0x414BE42: ??? (in /usr/lib/i386-linux-gnu/libxml2.so.2.7.8)
==8355==    by 0x414C598: ??? (in /usr/lib/i386-linux-gnu/libxml2.so.2.7.8)
==8355==    by 0x414BE42: ??? (in /usr/lib/i386-linux-gnu/libxml2.so.2.7.8)
==8355==    by 0x414C598: ??? (in /usr/lib/i386-linux-gnu/libxml2.so.2.7.8)
==8355==    by 0x414BE42: ??? (in /usr/lib/i386-linux-gnu/libxml2.so.2.7.8)
==8355==    by 0x414C598: ??? (in /usr/lib/i386-linux-gnu/libxml2.so.2.7.8)
==8355==    by 0x414BE42: ??? (in /usr/lib/i386-linux-gnu/libxml2.so.2.7.8)
==8355==    by 0x414B8B7: ??? (in /usr/lib/i386-linux-gnu/libxml2.so.2.7.8)
==8355==    by 0x414D339: xmlSaveFormatFileEnc (in
/usr/lib/i386-linux-gnu/libxml2.so.2.7.8)
==8355==    by 0x805D5F0: store_to_xmlfile(char*, char*)
(ram_utilities.cpp:248)
==8355==    by 0x805D3E1: FetchDataFromFifo() (ram_utilities.cpp:198)
==8355==    by 0x8050A5D: ThreadFn_RqstAnlysr(void*)
(request_analyser_module.cpp:134)
==8355==    by 0x42FDD4B: start_thread (pthread_create.c:308)
==8355==

メモリリークを回避するための対策を教えてください。

コードに xmlinitparser() と xmlCleanupParser() も追加しましたが、メモリ リークは止まりません。

xmlに保存するためのコードは以下の通りです...

void addxmldata(xmlDocPtr , xmlNodePtr , struct Res_Am_Snr_Body *);
void add_hr_dt(xmlNodePtr , struct Res_Am_Snr_Body *);
void add_min_dt(xmlNodePtr , struct Res_Am_Snr_Body *);
void add_snr_data(xmlNodePtr , struct Res_Am_Snr_Body *);

int store_to_xmlfile(char* msgbuf, char* xmlfile)
{
        int ret_val;
        xmlDocPtr doc = NULL;
        xmlNodePtr root_node = NULL;

        xmlInitParser();
        printf("In store_to_xmlfilexml file--->%s\n", xmlfile);

        doc = xmlParseFile(xmlfile);

        if(doc == NULL)
        {
                cout<<"failed to open-->"<<xmlfile<<endl;
        }

        root_node = xmlDocGetRootElement(doc);

        addxmldata(doc, root_node, msgbuf);

        cout<<"in store_to_xmlfile return"<<endl;

        ret_val = xmlSaveFormatFileEnc(xmlfile, doc, "UTF-8", 1);

        xmlFreeDoc(doc);

        xmlCleanupParser();

        return ret_val;

}

私は addhr、min、snr を特定の時間間隔で呼び出す addxmldata を呼び出しています。

xml ファイルは完全にビルドされていますが、多くのメモリ リークがあります。私のプログラムは継続的に実行されるはずですが、1 時間半後にクラッシュします。valgrind のメモリ リークはほぼ 2 GB です。valgrind レポートには、上記のエラーが繰り返し入力されていることが示されます。

私はvalgrindの使用に慣れていないので、助けてください。

4

1 に答える 1