mxml的mxmlDelete似乎不能很好釋放內存

mxml的mxmlDelete似乎不能很好釋放內存

第一次使用mxml庫來讀寫一些xml消息,偶爾發現內存佔用不斷增加,測試了一下,感覺mxmlDelete函數好像不能很好釋放內存。
···
#include <stdio.h>
#include <unistd.h>
#include <mxml.h>

void mymxmlDelete(mxml_node_t * node){//xmldelete似乎有內存泄漏,刪除不了子節點
mxml_node_t * childnode;
while((childnode=mxmlGetFirstChild(node))!=NULL)mymxmlDelete(childnode);
mxmlDelete(node);
}

void pmem(){
char s[100];
sprintf(s,“pmap -d %d|tail -n 1”,getpid());
system(s);
}

void writexml_sample2(int mydel,char * data){
mxml_node_t * xmldoc;
mxml_node_t * node;
xmldoc = mxmlNewElement(MXML_NO_PARENT,“Document”);
node=mxmlNewElement(xmldoc,“UserName”);
mxmlNewText(node,0,“root”);
node=mxmlNewElement(xmldoc,“Password”);
mxmlNewText(node,0,“passwd”);
mxmlSetWrapMargin(0);
mxmlSaveString(xmldoc,data,1024,MXML_NO_CALLBACK);
if(mydel)mymxmlDelete(xmldoc);
else mxmlDelete(xmldoc);
}

void writexml_sample(int mydel,char *s){
mxml_node_t xml; / <?xml ... ?> */
mxml_node_t data; / */
mxml_node_t node; / */

xml = mxmlNewXML("1.0");
data = mxmlNewElement(xml, "data");
node = mxmlNewElement(data, "node");
mxmlNewText(node, 0, "val1");
node = mxmlNewElement(data, "node");
mxmlNewText(node, 0, "val2");
node = mxmlNewElement(data, "node");
mxmlNewText(node, 0, "val3");
mxmlSetWrapMargin(0);
mxmlSaveString(xml,s,1024,MXML_NO_CALLBACK);
if(mydel)mymxmlDelete(xml);
else mxmlDelete(xml);

}

char * readxml_sample(int mydel,const char *s){
static char a[100];
mxml_node_t *xml,*data,*node;
xml=mxmlLoadString(NULL,s, MXML_NO_CALLBACK);
data=mxmlFindElement(xml,xml, “data”, NULL, NULL,MXML_DESCEND);
node=mxmlFindElement(data,xml, “node”, NULL, NULL,MXML_DESCEND);
strcpy(a,mxmlGetText(node,NULL));
if(mydel)mymxmlDelete(xml);
else mxmlDelete(xml);
return a;
}

int main(int argc,char **argv){
char data[10000];
int i,k=100000;
mxmlSetWrapMargin(0);
pmem();
for(i=0;i<k;i++)writexml_sample(1,data);
pmem();
for(i=0;i<k;i++)writexml_sample(0,data);
pmem();
puts(data);
for(i=0;i<k;i++)readxml_sample(1,data);
pmem();
for(i=0;i<k;i++)readxml_sample(0,data);
pmem();
puts(readxml_sample(0,data));
return 0;
}
···
以上是測試代碼。
使用gcc xml.c -lmxml編譯
運行結果如下:
mapped: 8444K writeable/private: 340K shared: 0K
mapped: 8444K writeable/private: 340K shared: 0K
mapped: 45932K writeable/private: 37828K shared: 0K

<?xml version="1.0" encoding="utf-8"?>val1val2val3

mapped: 45932K writeable/private: 37828K shared: 0K
mapped: 83420K writeable/private: 75316K shared: 0K
val1
可以看到,mxml自帶的mxmlDelete確實不能很好釋放內存
我自己寫了一個mymxmlDelete函數代碼mxmlDelete,目前看使用正常。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章