工作之余,在看老外寫的代碼,發現一個很有意思的東西,我們平時常說goto語句是有害的,主要是它跳來跳去,打亂邏輯。但goto也有好處,比如單出口,統一釋放內存方面,下面看下一個關於MAPI初始化的一個函數
int MapiInit() { int Result = DT_ERROR; HRESULT hResult = S_FALSE; HANDLE hLock = NULL; BOOL bLocked = FALSE; DWORD rc = WAIT_TIMEOUT; static LPCTSTR szLockName = _T("MAPIInit"); hLock = CreateMutex(NULL,FALSE,szLockName); if(!hLock) { goto error; } rc = WaitForSingleObject(hLock,0); if(rc == WAIT_OBJECT_0) { bLocked = TRUE; } if(!m_CoInitd) { hResult = CoInitialize(NULL); if(hResult != S_OK) { goto error; } m_CoInitd = TRUE; } if(!m_MapiInitd) { hResult = MAPIInitialize(NULL); if(hResult != S_OK) { goto error; } m_MapiInitd = TRUE; } Result = DT_OK; done: if (hLock) { if (bLocked) { ReleaseMutex(hLock); } CloseHandle(hLock); } return Result; error: Result = DT_ERROR; goto done; }
兩個goto,一個done,一個error,done主要是負責內存資源的釋放,error主要是賦值結果並返還done。
也就是說,如果程序只要不符合我們的走向,我們就打日志,然后goto error,而不是return,如果return的話,那么釋放資源怎么辦呢?
goto done的最大好處就是不用到處去釋放內存。若是多出口的話,要釋放的內容多了,滿到處都是釋放內存,也不知道有沒有泄露之內的。
