我写了一个模块,将一些实时数据转储到XML文件中 定期。 我最终使用xmlSaveFormatFileEnc()来保存文件。
但是我正在使用带有API的Valgrind获取内存泄漏报告 xmlSaveFormatFileEnc()。
泄漏摘要如下,
==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;
}
我正在调用addxmldata,而addxmldata又会在特定的时间间隔内调用addhr,min和snr。
xml文件完美构建但存在大量内存泄漏。我的程序应该连续运行但在一个半小时后崩溃。 valgrind中的内存泄漏几乎是2 GB。 valgrind报告显示上述错误的重复输入。
Plz帮助我,因为我是valgrind用法的新手。
答案 0 :(得分:2)
尝试删除对xmlCleanupParser
的调用。 documentation说:
这个功能名称有点误导。它不会清理解析器状态,它会清理库本身分配的内存。它是XML库的清理功能。它尝试回收为库处理分配的所有相关全局内存。它不会释放任何与文档相关的内存。只有当进程使用了库以及使用它构建的所有XML / HTML文档时,才应调用xmlCleanupParser()。另请参见xmlInitParser(),它具有为操作准备库的相反功能。警告:如果您的应用程序是多线程的或具有插件支持调用,如果另一个线程或插件仍在使用libxml2,则可能会使应用程序崩溃。有时很难猜测libxml2是否在应用程序中使用,某些库或插件可能会在不事先通知的情况下使用它。如果有疑问,请不要调用此函数或在调用exit()之前执行此操作以避免valgrind泄漏报告!
请注意最后一句话。只应在退出流程之前调用xmlCleanupParser
。