Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.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
C++ 潜在抛出功能信号是否安全?_C++_Exception_Signals_Undefined Behavior - Fatal编程技术网

C++ 潜在抛出功能信号是否安全?

C++ 潜在抛出功能信号是否安全?,c++,exception,signals,undefined-behavior,C++,Exception,Signals,Undefined Behavior,根据, 评估是信号安全的,除非它包括以下之一: 抛出异常 控制输入try块或函数try块 如果信号处理程序调用包含非信号安全的计算,则该调用具有未定义的行为 这是否意味着调用一个潜在的抛出函数,例如使用noexcept说明符声明的函数,其计算结果为false,会导致未定义的行为?或者,只有在计算有效地导致抛出异常时,才是未定义的行为 以下是一个例子: static void g()noexcept(false){ 外部“C”无效信号处理器(int sig) { 试一试{ g();//总是

根据,

评估是信号安全的,除非它包括以下之一:

  • 抛出异常
  • 控制输入try块或函数try块
如果信号处理程序调用包含非信号安全的计算,则该调用具有未定义的行为

这是否意味着调用一个潜在的抛出函数,例如使用
noexcept
说明符声明的函数,其计算结果为
false
,会导致未定义的行为?或者,只有在计算有效地导致抛出异常时,才是未定义的行为

以下是一个例子:

static void g()noexcept(false){
外部“C”无效信号处理器(int sig)
{
试一试{
g();//总是UB
}
捕获(…){
}
g();//总是UB吗?
}
“抛出异常”应该准确地理解为:抛出异常。不多不少

输入可能引发异常的范围不是一回事。只要代码没有实际抛出异常,就不会违反信号安全性

g()
不会引发异常,因此它本身是信号安全的。即使它没有显式地
noexcept(false)
,因为它不会引发异常,所以它是信号安全的


signal\u handler()
进入一个
try
块,该块不是信号安全的。在信号处理程序中输入它是未定义的行为。

根据您的引用,在调用
g
之前,在信号处理程序中输入
try
块已经是未定义的行为。信号处理程序可以做的事情非常有限。抛出的异常(即使捕获并处理)不是其中之一。考虑到
signal\u handler
本身是
noexcept(false)
,这可能没什么问题?@IgorTandetnik因此注释“always UB”没有尾随问号,为了比较起见,我在问题中引用并添加了try块