原創:劉樹偉
2013-10-16
假設有如下代碼:在Func函數一開始,爲p申請了10個int空間,在代碼執行過程中,如果中間步驟由於某些情況需要提前結束函數,那麼需要在結束前釋放p。
int Func()
{
int *p = new int[10];
if (true)
{
goto EXIT;
}
if (true)
{
goto EXIT;
}
EXIT:
delete[] p;
return 0;
}
常規的做法是使用goto語句,在需要結束函數時,把代碼goto到釋放空間的位置。其實我們可以使用while循環更好的解決這一問題:
首先我們先寫個只能單次執行的while循環:
while (true)
{
break;
}
然後在其中加入原來的代碼:
int Func2()
{
int *p = new int[10];
while (true)
{
if (true)
{
break;
}
if (true)
{
break;
}
break;
}
delete[] p;
return 0;
}
這樣是不是更好一些?
或者:
do
{
}while(false);
還有一種替代方案是使用__try/__finally:
HANDLE hRemoteProcess = NULL;
__try
{
hRemoteProcess = OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION|PROCESS_VM_WRITE, FALSE, dwProcessID);
if (hRemoteProcess == NULL)
{
nRet = -2;
__leave;
}
}
__finally
{
if (hRemoteProcess != NULL)
CloseHandle(hRemoteProcess);
}