DOM解析XML首先在内存中重建XML树,然后添加、代替、遍历均在内存中进行,所以内存不会释放!用SAX解析占内存少,适合解析大的XML文件!!

解决方案 »

  1.   

    注意这个宏的使用: A2BSTR(...) 它可能导致内存泄露. 应该这个函数释放SysFreeString(...)
      

  2.   

    CoInitialize和CoUninitialize的位置有点问题吧
    偶通常是放在App的InitInstance和ExitInstance里面的
    我的代码和你的差不多
    MSXML2::IXMLDOMDocument2Ptr pXMLDocument2("Msxml2.DOMDocument.4.0");
    CString strTemp;
    GetWindowText(strTemp);
    _bstr_t bstrXml((LPCTSTR)strTemp);
    try{
    pXMLDocument2->async=VARIANT_FALSE;
    VARIANT_BOOL varOkay = pXMLDocument2->loadXML(bstrXml);
    if (varOkay){
    g_pMainFrame->m_wndDocumentOutline.loadXML(pXMLDocument2.GetInterfacePtr(),FALSE);
    }
    else {
    CGlobal::g_PrintXMLDOMParseError(pXMLDocument2->parseError);
    return ;
    }
    }
    catch(_com_error &e){
    CGlobal::g_PrintComError(e);
    return ;
    }
    没有泄漏阿
      

  3.   

    代码基本上没有问题,但是CoUninitilize()位置确实有问题,
    HRESULT hr = pDoc.CreateInstance(__uuidof(MSXML::DOMDocument));if (SUCCEEDED(hr))
    ...CoUninitilize()和pDoc的成功实例化与否无关,只是初始化com库,一般放在最后
      

  4.   

    好像是CoInitialize和CoUninitialize的位置的问题我把它放出去后,再运行后,基本上内存不涨了,但是在我重复运行该段代码的前三次中内存还是会涨4K左右,以后就不会涨了。还有就是我如何将LoadXML中暴涨上去的内存释放出来。