2014-02-10 165 views
1

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

[ 
    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(); 
+0

VS 2010解决方案添加一个局部变量可以从 下载https://drive.google.com/file/d/0BwWrSUCFF-AXeGZoZ0tQR1lLbVk/edit?usp=sharing –

回答

0

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

您需要添加Release呼吁:在CMoLauncher::SerializeXML

  1. 第一InsertDOMElement电话。
  2. 在相同功能的回路中的InsertDOMElement调用(为了做到这一点InsertDOMElement的(返回值)
  3. InsertDOMElement呼叫CMoLauncher::GetXML(由xMRI看准)
+0

感谢您的帮助 –

+0

@RizwanHanif欢迎您。享受您的新荣誉特权。 – manuell

1

你需要释放pEntityNode呢!

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