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,目前看使用正常。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用GSAP(GreenSock Animation Platform)可以轻松实现小球的不规则移动。下面是一些示例代码: 首先,您需要在Flex项目中添加GSAP库。可以通过以下方式将库添加到您的项目中: ``` <mx:Script> <![CDATA[ import com.greensock.TweenMax; import com.greensock.easing.*; ]]> </mx:Script> ``` 接下来,您需要创建一个小球并将其添加到舞台上。可以使用以下代码创建一个小球: ``` <fx:Declarations> <s:Ellipse id="ball" width="50" height="50"> <s:fill> <s:SolidColor color="#FF0000"/> </s:fill> </s:Ellipse> </fx:Declarations> <s:Group id="container" width="100%" height="100%"> <s:Group id="ballContainer" width="100%" height="100%"> <s:Group width="100%" height="100%" clipAndEnableScrolling="false"> <s:Group id="movementPath"> <!-- Define the movement path of the ball here --> </s:Group> <s:Group id="ballGroup" x="0" y="0" width="100%" height="100%"> <s:Group id="ballStart" x="0" y="0" width="100%" height="100%"> <s:layout> <s:VerticalLayout verticalAlign="middle" horizontalAlign="center"/> </s:layout> <s:Label text="Click to Start Movement" click="startMovement()"/> </s:Group> <s:Group id="ballEnd" x="0" y="0" width="100%" height="100%"> <s:layout> <s:VerticalLayout verticalAlign="middle" horizontalAlign="center"/> </s:layout> <s:Label text="Movement Completed" visible="false"/> </s:Group> <s:Group id="ballPath" x="0" y="0" width="100%" height="100%" visible="false"> <s:layout> <s:VerticalLayout verticalAlign="middle" horizontalAlign="center"/> </s:layout> {ball} </s:Group> </s:Group> </s:Group> </s:Group> </s:Group> ``` 在上面的代码中,我们在Flex项目中创建了一个小球,并将其添加到舞台上。我们还创建了一个包含球的容器组和一个用于定义球运动路径的组。 现在,我们需要定义球的运动路径。我们可以使用GSAP的PathPlugin来定义不规则路径。以下是一个示例路径: ``` <mx:Script> <![CDATA[ import com.greensock.plugins.*; TweenPlugin.activate([BezierPlugin, BezierThroughPlugin, MorphSVGPlugin, MotionBlurPlugin, Physics2DPlugin, PhysicsPropsPlugin, ScrambleTextPlugin, ScrollToPlugin, TextPlugin]); private function startMovement():void { ballStart.visible = false; ballEnd.visible = false; ballPath.visible = true; var path:SVGPath = new SVGPath(); path.draw("M 0,0 L 0,200 C 0,200 100,300 300,300 C 500,300 600,200 600,200 L 600,0 Z"); var ballPathTween:TweenMax = TweenMax.to(ball, 5, { bezier: { curviness: 1.5, values: path.getBezier(50), autoRotate: true }, ease: Linear.easeNone, onComplete: movementComplete }); } private function movementComplete():void { ballEnd.visible = true; } ]]> </mx:Script> ``` 在上面的代码中,我们使用SVGPath对象定义了一个不规则路径。然后,我们使用TweenMax对象创建一个球的动画,将其沿着路径移动,并在完成后调用movementComplete()函数。 现在,当用户单击“Click to Start Movement”按钮时,球将开始沿着不规则路径移动,直到到达路径的末端。完成后,球将停止并显示“Movement Completed”标签。 希望这可以帮助您实现不规则移动的小球。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值