Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将在“后”之后添加语句;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? } PCONSOLE\u SCREEN\u BUFFER\u INFOEX GetConsoleInfo(无效){ WaitForSingleObject(m_hSync);//m_hSync是使用CreateMutex()创建的互斥体的句柄 return m_pcsbi;//m_pcsbi的类型为PCONSOLE\u SCREEN\u BUFFER\u INFOEX ReleaseMutex(m_hSync);//_C++_Visual C++_Return - Fatal编程技术网

将在“后”之后添加语句;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? } PCONSOLE\u SCREEN\u BUFFER\u INFOEX GetConsoleInfo(无效){ WaitForSingleObject(m_hSync);//m_hSync是使用CreateMutex()创建的互斥体的句柄 return m_pcsbi;//m_pcsbi的类型为PCONSOLE\u SCREEN\u BUFFER\u INFOEX ReleaseMutex(m_hSync);//

将在“后”之后添加语句;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? } PCONSOLE\u SCREEN\u BUFFER\u INFOEX GetConsoleInfo(无效){ WaitForSingleObject(m_hSync);//m_hSync是使用CreateMutex()创建的互斥体的句柄 return m_pcsbi;//m_pcsbi的类型为PCONSOLE\u SCREEN\u BUFFER\u INFOEX ReleaseMutex(m_hSync);//,c++,visual-c++,return,C++,Visual C++,Return,否,在返回语句之后,将调用作用域对象的析构函数,程序将退出该函数 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() { //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;
}

在该特定场景中,没有。您需要在离开函数之前释放互斥体。

在您的情况下,无法获取该代码。如果您有一个有条件的
返回(例如
If(ptr==nullptr)return;
)当然也有跳过返回的条件,但无条件返回将是最后执行的语句


但是,样式清理会在
返回后进行

否,但您可以有例外

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
}
这正是需要的地方,通过以下方式实现:

PCONSOLE\u SCREEN\u BUFFER\u INFOEX GetConsoleInfo()
{
静态std::互斥m_hSync;
std::unique_lock lock{m_hSync};
return m_pcsbi;//m_pcsbi的类型为PCONSOLE\u SCREEN\u BUFFER\u INFOEX
//互斥在这里被隐式释放
}

释放互斥锁应该在作用域结束时自动完成,包括抛出异常的情况(在。此时只能调用析构函数,并且
std::unique_lock
的析构函数会准确地释放互斥锁。

为什么不使用测试程序确定自己的身份?如果(0){..}
执行
中的语句吗?以同样的方式控制程序流。(MSVC++是否也警告过这一点?)无论你使用什么编译器,都应该有一个方法来激活警告;在这些警告中,应该有一个告诉你这个代码永远不会被执行。在现代C++中,我们有一个<代码> <代码>标题。它有一个漂亮的代码<代码:ST:::(包括函数作用域)什么都没有?析构函数在返回后执行。这为语言增添了美。非常感谢。您的回答帮助我理解这是如何执行的。(尝试勾选此答案,但在接下来的几分钟内不允许…)因此,为了释放互斥体,我必须这样做:WaitForSingleObject(m_hSync);PCONSOLE_SCREEN_BUFFER_INFOEX p=m_pcsbi;ReleaseMutex(m_hSync);返回p;我想在我的函数中调用Wait…()函数,因为调用我函数的人(GetConsoleInfo())可能不知道其他线程可能正在更改控制台信息…@tongko:不幸的是,这还不够。只有共享资源的两个用户也使用相同的互斥体时,互斥体才能保护共享资源。如果另一方不知道您的代码在控制台信息上工作,它就不会知道您的控制台信息互斥体对于C++初学者来说,术语“RAIIAL风格清理”可能有点不清楚,你不这么认为吗?):SpOK是真的,但同时,它至少是可以搜索的。
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
}