【LibUIDK界面庫系列文章】goto語句的替代方案



原創:劉樹偉

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);
 }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章