2014-02-10 194 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指針。您可以使用智能指針來避免這種錯誤。