首页 > 代码库 > 关于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语句的思考