ument3 *pXMLDoc = NULL;
IXMLDOMParseError * pObjError = NULL;
BSTR bstr = NULL;
VARIANT_BOOL status;
VARIANT vSrc;
CoInitialize(NULL);
hr = CoCreateInstance(CLSID_DOMDocument40,
NULL,
CLSCTX_INPROC_SERVER,
IID_IXMLDOMDocument3,
(void**)&pXMLDoc);
if (FAILED(hr))
{
printf("Failed to CoCreate an instance of an XML DOM\n");
printf("Error code: %x\n", hr);
goto clean;
}
hr = pXMLDoc->put_async(VARIANT_FALSE);
if (FAILED(hr))
{
printf("Failed to set async property\n");
goto clean;
}
hr = pXMLDoc->put_validateOnParse(VARIANT_FALSE);
if (FAILED(hr))
{
printf("Failed to set validateOnParse\n");
goto clean;
}
hr = pXMLDoc->put_resolveExternals(VARIANT_FALSE);
if (FAILED(hr))
{
printf("Failed to disable resolving externals.\n");
goto clean;
}
VariantInit(&vSrc);
V_BSTR(&vSrc) = SysAllocString(L"stocks.xml");
V_VT(&vSrc) = VT_BSTR;
hr = pXMLDoc->load(vSrc, &status);
if(status!=VARIANT_TRUE)
{
hr = pXMLDoc->get_parseError(&pObjError);
hr = pObjError->get_reason(&bstr);
printf("Failed to load DOM from books.xml. %S\n",bstr);
goto clean;
}
hr = pXMLDoc->get_xml(&bstr);
printf("stocks.xml:\n%S\n", bstr);
clean:
if (bstr)
SysFreeString(bstr);
if (&vSrc)
VariantClear(&vSrc);
if (pObjError)
pObjError->Release();
if (pXMLDoc)
pXMLDoc->Release();
CoUninitialize();
return 0;
}
使用goto后,指针集中释放,即使出现内存泄露也很容易发现,而且指针空间的释放都
只出现了1次-------出错易排查。
借那句经典的话吧:goto少用、慎用,但是不能禁用。
摘自 lingxiu0613的专栏