void CClientSocket::Encode(S_Data *sData,CString &xml)
{
TiXmlDocument doc; 
TiXmlDeclaration *decl = new TiXmlDeclaration("1.0", "utf-8", ""); 
if(decl == NULL)
{
AfxMessageBox("CClientSocket::Encode error");
}
doc.LinkEndChild( decl ); TiXmlElement *lmtRoot = new TiXmlElement("command"); 
if(lmtRoot == NULL)
{
AfxMessageBox("CClientSocket::Encode error1");
}
doc.LinkEndChild(lmtRoot); TiXmlElement *lmtId = new TiXmlElement("id");
if(lmtId == NULL)
{
AfxMessageBox("CClientSocket::Encode error2");
}
lmtRoot->LinkEndChild(lmtId);
CString tmp;
tmp.Format("%d",sData->commandId);
TiXmlText *txtId = new TiXmlText(tmp);
if(txtId == NULL)
{
AfxMessageBox("CClientSocket::Encode error3");
}
lmtId->LinkEndChild(txtId); TiXmlElement *lmtName = new TiXmlElement("name");
if(lmtName == NULL)
{
AfxMessageBox("CClientSocket::Encode error4");
}
lmtRoot->LinkEndChild(lmtName);
TiXmlText *txtName = new TiXmlText(sData->commandName);
if(txtName == NULL)
{
AfxMessageBox("CClientSocket::Encode error5");
}
lmtName->LinkEndChild(txtName); TiXmlElement *lmtType = new TiXmlElement("type");
if(lmtType == NULL)
{
AfxMessageBox("CClientSocket::Encode error6");
}
lmtRoot->LinkEndChild(lmtType);
TiXmlText *txtType = new TiXmlText(sData->type);
if(txtType == NULL)
{
AfxMessageBox("CClientSocket::Encode error7");
}
lmtType->LinkEndChild(txtType); TiXmlElement *lmtParamRoot = new TiXmlElement("params");
if(lmtParamRoot == NULL)
{
AfxMessageBox("CClientSocket::Encode error8");
}
lmtRoot->LinkEndChild(lmtParamRoot); for (int i = 0; i < sData->params.size(); i ++)
{
TiXmlElement *lmtTmp = new TiXmlElement("param");
if(lmtTmp == NULL)
{
AfxMessageBox("CClientSocket::Encode error9");
}
lmtParamRoot->LinkEndChild(lmtTmp); TiXmlElement *lmtKey = new TiXmlElement("key");
if(lmtKey == NULL)
{
AfxMessageBox("CClientSocket::Encode error10");
}
lmtTmp->LinkEndChild(lmtKey);
TiXmlText *txtKey = new TiXmlText((CString)sData->params.at(i));
if(txtKey == NULL)
{
AfxMessageBox("CClientSocket::Encode error11");
}
lmtKey->LinkEndChild(txtKey); TiXmlElement *lmtValue = new TiXmlElement("value");
if(lmtValue == NULL)
{
AfxMessageBox("CClientSocket::Encode error12");
}
lmtTmp->LinkEndChild(lmtValue);
TiXmlText *txtValue = new TiXmlText((CString)sData->params.at(i + 1));
if(txtValue == NULL)
{
AfxMessageBox("CClientSocket::Encode error13");
}
lmtValue->LinkEndChild(txtValue);

i ++;
} //doc.SaveFile( "d:\\test.XML" );
TiXmlPrinter printer;
doc.Accept(&printer);

xml.Format("%s",printer.CStr());
/*是否需要DELETE?
//20130222 add by cq
delete lmtParamRoot;
delete txtType;
delete lmtType;
delete txtName;
delete lmtName;
delete txtId;
delete lmtId;
delete lmtRoot;
delete decl;
*/}这是我的xml编码函数。原来所有的NEW的指针都没有DELETE,但我加了DELETE又会出错所以我现在的问题是。这些new难到不需要DELETE,如果需要又应该如何DELETE.
或者谁给个正确的XML编码的类。感谢!VC XML编码的内存释放

解决方案 »

  1.   

    你没有delete的时候有内存泄露提示么?
      

  2.   

    因为我们软件BUG很多。我分不清那泄露,所以我就从所有的NEW来查找DELETE配对。
    所以我想看看有没有熟悉XML解码的看看上面的做法是不是正确的。
      

  3.   

    内存泄露和xml解码有什么必然联系么new 后 不用就要delete!
      

  4.   

    TiXmlDocument doc;
    不用delete。其实你稍微百度一下就可以查到,doc在析构时会delete所有的节点。