哎,老了!这是我写的一个解析xml的程序,编译,运行没有问题,就是内存一直在增加,??开源的,想要留下mail

hx_zm 2004-06-29 11:03:11
//DTD struct
typedef struct DTDNode
{
int NodeIx;
char Name[20];
int Arity;
struct DTDNode *Children[50];
struct DTDNode *Parent;
} STRUCTDTD;

在遇到新元素时

void SAX2CountHandlers::startElement(const XMLCh* const uri
, const XMLCh* const localname
, const XMLCh* const qname
, const Attributes& attrs)
{

StackElement *FirstSib=new StackElement;
STRUCTDTD *NodeTmp;

FirstSib->ElementName="NULL";
FirstSib->NodeIx=0;
FirstSib->position=0;

StackElement *elemTmp=new StackElement;

elemTmp->ElementName=XMLString::transcode(localname);
elemTmp->NodeIx=m_nodeIx;
elemTmp->position=SibilingStack.SearchPosition(elemTmp->ElementName);
DP.AppendPosition(elemTmp->position);

// Insert a node into DTD and a data path node
NodeTmp=MyDTD.GetCurrentNode();
STRUCTDTD *Tmp;
if (!MyDTD.SearchName(NodeTmp,elemTmp->ElementName))
{
++m_nodeIx;
m_DTDNode = new STRUCTDTD;
strcpy(m_DTDNode->Name,elemTmp->ElementName);
m_DTDNode->NodeIx=m_nodeIx;
m_DTDNode->Arity=0;
MyDTD.InsertNode(m_DTDNode);
MyDP.InsertNode(m_nodeIx);
char *ssTmp=DP.GetDP();
MyDP.InsertDP(m_nodeIx,ssTmp,m_ValueIx);
}
else // if there is node named ElementName, itis only to add a new data path
{
Tmp=MyDTD.GetCurrentNode();
if (Tmp->Arity<elemTmp->position)
MyDTD.UpdateArity(elemTmp->position);
unsigned int NodeIx=Tmp->NodeIx;
char *ssTmp=DP.GetDP();
MyDP.InsertDP(NodeIx,ssTmp,m_ValueIx);
}

// int parent=(ElemStack.Peek()).NodeIx;
// int priorSib=(SibilingStack.Peek()).NodeIx;

SibilingStack.Push(elemTmp);
SibilingStack.Push(FirstSib);

fElementCount++;
ElemStack.Push(elemTmp);

fAttrCount += attrs.getLength();
if (attrs.getLength()!=0)
for (int i=0;i<attrs.getLength();i++)
{
NodeTmp=MyDTD.GetCurrentNode();
DP.AppendPosition(0);
char *sTmp=XMLString::transcode(attrs.getLocalName(i));
if (!MyDTD.SearchName(NodeTmp,sTmp))
{
++m_nodeIx;
m_DTDNode = new STRUCTDTD;
strcpy(m_DTDNode->Name,sTmp);
m_DTDNode->NodeIx=m_nodeIx;
m_DTDNode->Arity=0; //how to compute arity of an attribute???
MyDTD.InsertNode(m_DTDNode);
MyDP.InsertNode(m_nodeIx);
char *ssTmp=DP.GetDP();
MyDP.InsertDP(m_nodeIx,ssTmp,m_ValueIx);
}
else
{
Tmp=MyDTD.GetCurrentNode();
if (Tmp->Arity<elemTmp->position)
MyDTD.UpdateArity(elemTmp->position);
unsigned int NodeIx=Tmp->NodeIx;
char *ssTmp=DP.GetDP();
MyDP.InsertDP(NodeIx,ssTmp,m_ValueIx);
}
MyDTD.ReturnParent();
DP.DeletePosition();
}
delete FirstSib;
FirstSib=NULL;
delete elemTmp;
elemTmp=NULL;
}
...全文
227 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
easthg 2004-09-01
  • 打赏
  • 举报
回复
haoguang@263.net 多谢.
Mr-Chen 2004-09-01
  • 打赏
  • 举报
回复
sintekVip@163.com
谢谢
keke1976 2004-07-07
  • 打赏
  • 举报
回复
zhk_ly@163.com
heavenchang 2004-07-07
  • 打赏
  • 举报
回复
heaven_chang@126.com
xjtt2000 2004-07-07
  • 打赏
  • 举报
回复
全局变量更不应该有内存增长,一旦分配,在使用过程不越界,在退出时才释放。
xjtt2000@163.net
Invader 2004-07-07
  • 打赏
  • 举报
回复
kouych@163.com
MikeChen2003 2004-07-01
  • 打赏
  • 举报
回复
chenlianwu@yahoo.com.cn
yifanlxj 2004-07-01
  • 打赏
  • 举报
回复
yifan1359@hotmail.com
egxsun 2004-07-01
  • 打赏
  • 举报
回复
我想要,谢谢!
egxsun@hotmail.com
xdsh00 2004-07-01
  • 打赏
  • 举报
回复
xdsh00@yahoo.com.cn
whmily 2004-06-30
  • 打赏
  • 举报
回复
whmily1117@tom.com
hx_zm 2004-06-30
  • 打赏
  • 举报
回复
楼上的已经发了,如果你们有改进,请告诉我!Thanks.
dlscdn 2004-06-29
  • 打赏
  • 举报
回复
samson_duan@hotmail.com
hopen 2004-06-29
  • 打赏
  • 举报
回复
hopen2000@hotmail.com
windyloft 2004-06-29
  • 打赏
  • 举报
回复
wyf@syntc.com.cn
西山小月 2004-06-29
  • 打赏
  • 举报
回复
slek706@163.com
hx_zm 2004-06-29
  • 打赏
  • 举报
回复
To: honorwinner(用勤奋获得荣誉)
thanks。1,我用的是sax不是msxml.dll。2,内存该释放的地方我已经释放了:-)。
3,我可以给你代码,要sax的支持。
honorwinner 2004-06-29
  • 打赏
  • 举报
回复
老大,这样不行啊!
微软的msxml.dll在使用时,他自身是没有内存问题的,所以碰到内存不断增长的问题,原因是出现在我们的代码中,如果没有内存泄漏,那么一定是在内存该释放的地方没有释放,你可以追查一下代码,把某些公共变量修改为局部变量(根据我的经验,这很重要,在解析xml文件的时候尽可能少用全局变量),从而可以在某个函数执行完毕的时候马上释放,另外,尽可能的使用指针对象,这样可以及时delete掉指针,从而避免那些实例对象在内存中等到程序退出才释放占有的内存。

你的StackElement类是什么样子的,我觉得可能出在这里。
howtotell 2004-06-29
  • 打赏
  • 举报
回复
chenbin27@tom.com
Micro_Sheng 2004-06-29
  • 打赏
  • 举报
回复
zxs_001@163.net

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧