码迷,mamicode.com
首页 > 编程语言 > 详细

关于C++ goto语句的思考

时间:2014-12-19 14:24:56      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:

工作之余,在看老外写的代码,发现一个很有意思的东西,我们平时常说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语句的思考

标签:

原文地址:http://www.cnblogs.com/lijie-vs/p/4173678.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!