首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IXMLDOMDocument内存泄漏问题

IXMLDOMDocument内存泄漏问题
EN

Stack Overflow用户
提问于 2014-02-10 12:28:21
回答 2查看 1.1K关注 0票数 2

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

我的COM服务器接口方法是

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

它的代码是

代码语言:javascript
复制
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;
}

客户端中的使用代码是

代码语言:javascript
复制
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();
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-10 17:40:53

IXMLDOMNode*返回的CMoLauncher::InsertDOMElement从未发布过,这是一个很大的漏洞。

您需要添加Release调用:

  1. InsertDOMElementCMoLauncher::SerializeXML中的第一个调用。
  2. InsertDOMElement在循环中调用同一个函数(为此添加一个局部变量)(返回InsertDOMElement的值)
  3. InsertDOMElement call in CMoLauncher::GetXML (由xMRI发现)
票数 1
EN

Stack Overflow用户

发布于 2014-02-10 15:10:22

您也需要发布pEntityNode!

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21677262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档