//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;
}

解决方案 »

  1.   

    老大,这样不行啊!
    微软的msxml.dll在使用时,他自身是没有内存问题的,所以碰到内存不断增长的问题,原因是出现在我们的代码中,如果没有内存泄漏,那么一定是在内存该释放的地方没有释放,你可以追查一下代码,把某些公共变量修改为局部变量(根据我的经验,这很重要,在解析xml文件的时候尽可能少用全局变量),从而可以在某个函数执行完毕的时候马上释放,另外,尽可能的使用指针对象,这样可以及时delete掉指针,从而避免那些实例对象在内存中等到程序退出才释放占有的内存。你的StackElement类是什么样子的,我觉得可能出在这里。
      

  2.   

    To: honorwinner(用勤奋获得荣誉) 
    thanks。1,我用的是sax不是msxml.dll。2,内存该释放的地方我已经释放了:-)。
    3,我可以给你代码,要sax的支持。
      

  3.   

    楼上的已经发了,如果你们有改进,请告诉我!Thanks.
      

  4.   

    我想要,谢谢!
    [email protected]
      

  5.   

    全局变量更不应该有内存增长,一旦分配,在使用过程不越界,在退出时才释放。
    [email protected]