首页 > 代码库 > 关于C++ goto语句的思考
关于C++ goto语句的思考
工作之余,在看老外写的代码,发现一个很有意思的东西,我们平时常说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的最大好处就是不用到处去释放内存。若是多出口的话,要释放的内容多了,满到处都是释放内存,也不知道有没有泄露之内的。
关于C++ goto语句的思考
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。