IXMLDOMDocument内存泄漏问题

时间:2014-02-10 12:28:22

标签: visual-c++ memory-leaks com mfc atl

我有一个COM inproc服务器测试应用程序,它使用IXMLDOMDocument写入数据并将其发送回COM客户端。我使用get_xml()来获取BSTR。但是,当应用程序结束时,它几乎消耗了> 20 MB内存,如果我不使用COM inproc服务器,它使用< 1 MB。
我的COM服务器接口方法是

[
    object,
    uuid(BF798ED1-DCDD-4B29-B552-3A17F1D7E4CF),
    dual,
    nonextensible,
    pointer_default(unique)
]
interface IMoLauncher : IDispatch{
    [id(1)] HRESULT GetXML([out] BSTR* bStr);
};

它的代码是

STDMETHODIMP CMoLauncher::GetXML(BSTR* bStr)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    BOOL result = FALSE;
    IXMLDOMDocument* pDoc = NULL;
    HRESULT hr = CoCreateInstance(CLSID_DOMDocument, NULL, CLSCTX_INPROC_SERVER,
                                  IID_IXMLDOMDocument, (void**)&pDoc);

    if ( SUCCEEDED(hr) )
    {
        result = TRUE;
        IXMLDOMNode* pEntityNode = InsertDOMElement(pDoc, NULL, L"Entity", NULL);
        SerializeXML(pDoc, pEntityNode);
        pDoc->get_xml(bStr);
        pDoc->Release();
    }
    return result;
}

客户端中的使用代码是

CoInitialize(NULL);
IMoLauncher* launcher = NULL;
IUnknown* unknown = NULL;
HRESULT result = CoCreateInstance(CLSID_MoLauncher,NULL,CLSCTX_INPROC_SERVER,IID_IMoLauncher,(void**)&launcher);
if(result==S_OK)
{
    for(int i=0;i<iterationCount;i++)
    {
        BSTR bStr;
        launcher->GetXML( &bStr);
        printf("Iteration %d\n",i);
        ::SysFreeString(bStr);
    }
}
launcher->Release();
CoUninitialize();

2 个答案:

答案 0 :(得分:1)

你也需要发布pEntityNode!

必须释放由接口或COM函数返回的每个COM指针。您可以使用智能指针来避免此类错误。

答案 1 :(得分:0)

IXMLDOMNode*返回的CMoLauncher::InsertDOMElement永远不会被释放,这是一个很大的泄漏。

您需要为:{/ p>添加Release次来电

  1. InsertDOMElement中的第一个CMoLauncher::SerializeXML来电。
  2. InsertDOMElement在同一个函数的循环中调用(添加一个局部变量以便这样做(返回InsertDOMElement的值)
  3. InsertDOMElement中的CMoLauncher::GetXML来电(由xMRI发现)