C++标准抛出异常状态有关的std::call_once
执行与抛出异常(§30.4.4.2/ 2)的功能如下:从标准:: call_once的
2 /效果:call_once的的执行那不称它的功能是被动执行。调用其func的call_once的执行是主动执行。主动执行应调用INVOKE(DECAY_- COPY(std :: forward(func)),DECAY_COPY(std :: forward(args))...)。 如果这样的func调用引发异常,则执行异常,否则返回。异常执行应将异常传播给call_once的调用者。在任何给定once_flag的call_once的所有执行中:最多一个应该是返回执行;如果有一个返回的执行,它应该是最后一次执行;只有在执行完成后才会被动执行。 [注意:被动执行允许其他线程可靠地观察先前返回执行产生的结果。 - 注完]
我使用Visual Studio 2012,并运行下面的代码:
void f(){
throw std::exception("Catch me!");
}
int main(int argc, char* argv[]){
once_flag flag;
try{
call_once(flag, f);
} catch(const std::exception& e){
cout << e.what() << endl;
}
return 0;
}
我的结果是:在catch块中运行的代码,并打印消息,但是当程序存在我得到abort()
呼叫并打印以下信息来清点:
... \ mutex.c(38)互斥破坏而忙碌
这是否应该发生?
不,这是一个错误,程序应该可以正常工作(尽管你对'std :: exception'使用非标准的构造函数,在ISO C++中,你只能默认构造'std :: exception',频繁的可移植性问题,当MSVC用户检查incode是要在其他实现编译) – 2013-03-09 14:14:49