使用libxml2的xmlSaveFormatFileEnc中存在valgrind的XML内存泄漏



我编写了一个模块,用于将一些实时数据转储到位于定期。我最后使用xmlSaveFormatFileEnc()来保存文件。

但我得到了内存泄漏报告的Valgrind与APIxmlSaveFormatFileEnc()。

泄漏总结如下,

==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--->%sn", 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;

}

我调用addxmldata,它依次以特定的时间间隔调用addhr、min和snr。

xml文件构建得很完美,但存在大量内存泄漏。我的程序本应连续运行,但一个半小时后就崩溃了。valgrind中的内存泄漏几乎为2GB。valgrind报告显示重复输入上述错误。

请帮帮我,因为我是个新手。

尝试删除对xmlCleanupParser的调用。文件上写着:

这个函数名称有些误导性。它不清理解析器状态,而是清理库本身分配的内存。它是XML库的清理函数。它试图回收为库处理分配的所有相关全局内存。它不会释放任何与文档相关的内存。只有当进程使用完库和所有使用它构建的XML/HTML文档时,才应该调用xmlCleanupParser()。另请参阅xmlInitParser(),它具有相反的功能,即为操作准备库。警告:如果您的应用程序是多线程的或具有插件支持,如果另一个线程或插件仍在使用libxml2,则调用此命令可能会导致应用程序崩溃。有时很难猜测应用程序中是否使用了libxml2,一些库或插件可能会在没有通知的情况下使用它。如果有疑问,请不要调用此函数,或者在调用exit()之前执行此操作,以避免valgrind的泄漏报告!

记下最后一句话。仅应在退出进程之前调用xmlCleanupParser

最新更新