我有一个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();
答案 0 :(得分:1)
你也需要发布pEntityNode!
必须释放由接口或COM函数返回的每个COM指针。您可以使用智能指针来避免此类错误。
答案 1 :(得分:0)
从IXMLDOMNode*
返回的CMoLauncher::InsertDOMElement
永远不会被释放,这是一个很大的泄漏。
您需要为:{/ p>添加Release
次来电
InsertDOMElement
中的第一个CMoLauncher::SerializeXML
来电。InsertDOMElement
在同一个函数的循环中调用(添加一个局部变量以便这样做(返回InsertDOMElement的值)InsertDOMElement
中的CMoLauncher::GetXML
来电(由xMRI发现)