是否会执行“return”关键字后的语句?

时间:2014-04-16 06:58:19

标签: c++ visual-c++ return

我是C ++初学者,想知道这种情况的影响:

PCONSOLE_SCREEN_BUFFER_INFOEX GetConsoleInfo(void) {
    WaitForSingleObject(m_hSync);   // m_hSync is HANDLE to mutex created using CreateMutex()

    return m_pcsbi;    // m_pcsbi is of type PCONSOLE_SCREEN_BUFFER_INFOEX

    ReleaseMutex(m_hSync);      // <== will this line be executed?
}

想知道[ReleaseMutex()]会被执行吗?

5 个答案:

答案 0 :(得分:6)

在你的情况下,无法获得该代码。如果您有条件return(例如if (ptr==nullptr) return;),那么当然有条件会跳过返回。但无条件的回报将是最后执行的陈述。

但是,return之后会发生RAII样式清理。

答案 1 :(得分:3)

在特定情况下没有。您需要在离开函数之前释放互斥锁。

答案 2 :(得分:2)

不,在返回语句之后,将调用范围对象的析构函数,程序将退出该函数。

int main() { //Step 1
   GetConsoleInfo(); //2

   return (0); //6
}

PCONSOLE_SCREEN_BUFFER_INFOEX GetConsoleInfo(void) { //3
    WaitForSingleObject(m_hSync); //4

    return m_pcsbi; //5

    ReleaseMutex(m_hSync);
}

也许你应该这样做:

int main() {
   WaitForSingleObject(m_hSync);
   GetConsoleInfo();
   ReleaseMutex(m_hSync);
   return (0);
}

PCONSOLE_SCREEN_BUFFER_INFOEX GetConsoleInfo(void) {
    return m_pcsbi;
}

答案 3 :(得分:0)

不,但你可以有例外

if语句的例子:

   PCONSOLE_SCREEN_BUFFER_INFOEX GetConsoleInfo(void) {
     WaitForSingleObject(m_hSync);   // m_hSync is HANDLE to mutex created using CreateMutex()


     //if(statement)
            return m_pcsbi;    // m_pcsbi is of type PCONSOLE_SCREEN_BUFFER_INFOEX
     //else
          ReleaseMutex(m_hSync);      // if the statement is false, it will skip return and execute this line
}

答案 4 :(得分:0)

这正是需要RAII的地方,由std::unique_lock实施:

PCONSOLE_SCREEN_BUFFER_INFOEX GetConsoleInfo()
{
    static std::mutex m_hSync;
    std::unique_lock<std::mutex> lock{m_hSync};

    return m_pcsbi;    // m_pcsbi is of type PCONSOLE_SCREEN_BUFFER_INFOEX

    // mutex is released implicitly here
}

释放互斥锁是应该在范围结束时自动完成的,包括抛出异常的情况(在stack unwinding期间)。此时只能调用析构函数,而std::unique_lock的析构函数会准确释放互斥锁。