一直不知道csdn的帖子不能编辑,上个帖子指接把代码贴进去了,结果被鄙视了两次。干脆把那个帖子结贴了,重开一个提问。谢谢捧场。
#import <msxml4.dll> //raw_interfaces_only 
using namespace MSXML2; 
hr = pXmlDoc.CreateInstance(__uuidof(MSXML2::DOMDocument)); 
if (FAILED(hr)) 

AfxMessageBox("Faild to Create XMLDom Instance !"); 
pXmlDoc=NULL; 

else 
{  _bstr_t xmlstr=(LPCSTR)strResult; 
VARIANT_BOOL bresult; 
bresult = pXmlDoc->loadXML(xmlstr); 
if (!bresult) 

pXmlDoc->Release(); 
pXmlDoc=NULL; 

else 

long count = -1; 
pXmlDoc->get_childNodes(&pXmlList); 
if (pXmlList == NULL) 

throw; 

pXmlList->get_length(&count); 
for(int i = 0; i < count ;i++) 

pXmlList->raw_nextNode(&pXmlNode); 
if(!pXmlNode) 
break; 

pXmlNode->raw_selectSingleNode(bProperty,&pXDNTemp); 
if (pXDNTemp!= NULL) 

pXDNTemp->get_text(&bStrText); 
pXDNTemp->Release(); 
pXDNTemp = NULL; 

if (bStrText != NULL) 

strProperty= CString(bStrText); 
SysFreeString(bStrText); 
bStrText = NULL; 

pXmlNode->raw_selectSingleNode(bSerialID,&pXDNTemp); 
if (pXDNTemp!= NULL) 

pXDNTemp->get_text(&bStrText); 
pXDNTemp->Release(); 
pXDNTemp = NULL; 

if (bStrText != NULL) 

strSerialID= CString(bStrText); 
SysFreeString(bStrText); 
bStrText = NULL; 
if (pView == NULL) 

break; 


pXmlNode->raw_selectSingleNode(bEquipeName,&pXDNTemp); 
if (pXDNTemp!= NULL) 

pXDNTemp->get_text(&bStrText); 
pXDNTemp->Release(); 
pXDNTemp = NULL; 

if (bStrText != NULL) 

strEquipeName = CString(bStrText); 
SysFreeString(bStrText); 
bStrText = NULL; 

pXmlNode->raw_selectSingleNode(bMsgData,&pXDNTMsgData); 
if (pXDNTMsgData!= NULL) 

pXDNTMsgData->raw_selectSingleNode(bCheckState,&pXDNTemp); 
if (pXDNTemp!= NULL) 

pXDNTemp->get_text(&bStrText); 
pXDNTemp->Release(); 
pXDNTemp = NULL; 

if (bStrText != NULL) 

strCheckState= CString(bStrText); 
SysFreeString(bStrText); 
bStrText = NULL; 

pXDNTMsgData->raw_selectSingleNode(bResultInfo,&pXDNTemp); 
if (pXDNTemp!= NULL) 

pXDNTemp->get_attributes(&pXmlNamedNodeMap); 
if (pXmlNamedNodeMap!= NULL) 

pXmlNamedNodeMap->getNamedItem("result_type")->get_text(&bStrText); 
if (bStrText != NULL) 

strIResultType= CString(bStrText); 
SysFreeString(bStrText); 
bStrText = NULL; 

pXmlNamedNodeMap->Release(); 
pXmlNamedNodeMap = NULL; 

pXDNTemp->get_text(&bStrText); 
pXDNTemp->Release(); 
pXDNTemp = NULL; 

if (bStrText != NULL) 

strResultInfo= CString(bStrText); 
SysFreeString(bStrText); 
bStrText = NULL; 

pXDNTMsgData->raw_selectSingleNode(bCheckedCount,&pXDNTemp); 
if (pXDNTemp!= NULL) 

pXDNTemp->get_text(&bStrText); 
pXDNTemp->Release(); 
pXDNTemp = NULL; 

if (bStrText!= NULL) 

strCheckedCount = CString(bStrText); 
SysFreeString(bStrText); 
bStrText = NULL; 

pXDNTMsgData->Release(); 
pXDNTMsgData = NULL; 

}
}
}

解决方案 »

  1.   

     SysFreeString(bStrText); 
    应该是内存没有释放掉。你可以debug下
      

  2.   

    没看到你的pXmlDoc.Release()啊。对于智能指针,直接用.Release()释放(代替->Release()和=NULL)比较方便。
      

  3.   

    if (pXmlDoc!= NULL)
    {
    pXmlDoc.Release();
    pXmlDoc = NULL;
    }
    if (pXmlNode!=NULL)
    {
    pXmlNode->Release();
    pXmlNode = NULL;
    }
    if (pXmlList != NULL)
    {
    pXmlList->Release();
    pXmlList = NULL;
    }
    if (pXDNTMsgData != NULL)
    {
    pXDNTMsgData->Release();
    pXDNTMsgData = NULL;
    }
    if (pXDNTemp != NULL)
    {
    pXDNTemp->Release();
    pXDNTemp = NULL;
    }
    if (pXmlNamedNodeMap != NULL)
    {
    pXmlNamedNodeMap->Release();
    pXmlNamedNodeMap = NULL;
    }
    这部分忘记贴了。
      

  4.   

    还真是这个问题。
    以前系统里有解析xml的代码,直接拿过一部分来用了,因为原来数据量小,没发现这个问题。