标签:
工作之余,在看老外写的代码,发现一个很有意思的东西,我们平时常说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的最大好处就是不用到处去释放内存。若是多出口的话,要释放的内容多了,满到处都是释放内存,也不知道有没有泄露之内的。
标签:
原文地址:http://www.cnblogs.com/lijie-vs/p/4173678.html