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