关于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的最大好处就是不用到处去释放内存。若是多出口的话,要释放的内容多了,满到处都是释放内存,也不知道有没有泄露之内的。

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM