我有一個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();
VS 2010解決方案添加一個局部變量可以從 下載https://drive.google.com/file/d/0BwWrSUCFF-AXeGZoZ0tQR1lLbVk/edit?usp=sharing –