1.使用__try __finally的情形:
下面的调用,如果FunX出现异常,导致m_hMem没有释放。
void Fun1()
{
// dosth...
FunX();
WaitForSingleObject(m_hMem, INFINITE);
CloseHandle(m_hMem);
}
使用try finally修改如下:
void Fun2()
{
// dosth
__try
{
FunX();
WaitForSingleObject(m_hMem, INFINITE);
}
__finally
{
CloseHandle(m_hMem);
}
}
2.优化代码结构
类似下面的函数代码结构复杂
void Fun3()
{
HRESULT hres = NULL;
IWbemLocator *pLoc = 0;
IWbemServices *pSvc = 0;
hres = CoInitializeEx(0, COINIT_APARTMENTTHREADED);
if (FAILED(hres))
{
return 0;
}
hres = CoInitializeSecurity(NULL, -1, ...);
if (FAILED(hres))
{
CoUninitialize();
return 0;
}
hres = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *)&pLoc);
if (FAILED(hres))
{
CoUninitialize();
return 0;
}
hres = pLoc->ConnectServer(_bstr_t(L"ROOT\\CIMV2"), ...);
if (FAILED(hres))
{
pLoc->Release();
CoUninitialize();
return 0;
}
// dosth
...
return 1;
}
使用try finally
void Fun3()
{
bool bInitOk = false;
HRESULT hres = NULL;
IWbemLocator *pLoc = 0;
IWbemServices *pSvc = 0;
__try
{
hres = CoInitializeEx(0, COINIT_APARTMENTTHREADED);
if (FAILED(hres))
{
__leave
}
bInitOk = true;
hres = CoInitializeSecurity(NULL, -1, ...);
if (FAILED(hres))
{
__leave
}
hres = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *)&pLoc);
if (FAILED(hres))
{
__leave
}
hres = pLoc->ConnectServer(_bstr_t(L"ROOT\\CIMV2"), ...);
if (FAILED(hres))
{
__leave
}
// dosth
...
}
__finally
{
if (pLoc != 0)
pLoc->Release();
if (pSvc != 0)
pSvc->Release();
if (bInitOk)
CoUninitialize();
if (FAILED(hres))
return 0;
}
return 1;
}