關於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