信号处理程序中不允许使用对象或函数

时间:2014-07-08 12:05:59

标签: c++ signals std

我正在寻找"信号处理程序中不允许的对象或函数的定义" 。它在秒中使用。 N3797的3.6.3 / 4:

  

如果使用标准库对象或功能   在信号处理程序中允许(18.10)以前没有发生过   (1.10)用静态存储器完成对物体的破坏   持续时间和执行std :: atexit注册函数(18.5),.   程序有不确定的行为。

一般来说,我想找到这个UB规则的一个例子。

1 个答案:

答案 0 :(得分:0)

在18.10 / 9中的引用草案中:

  

C和C ++语言的通用子集包含可能出现在格式良好的C ++程序中以及符合C程序的所有声明,定义和表达式。 POF(“普通旧函数”)是仅使用此公共特征的函数   子集,并没有直接或间接使用任何功能   不是POF,除了它可以使用第29章中定义的函数   这不是成员函数。所有信号处理器应具有C.   连锁。可以在符合条件下用作信号处理程序的POF   当用作信号时,C程序不会产生未定义的行为   C ++程序中的处理程序。在C ++程序中用作信号处理程序的任何其他函数的行为是实现定义的。 228

信号处理程序中允许的函数在C ++和C中都是有效的。此外,您可以使用原子非成员函数(第29条)。实现可能允许其他功能工作,但请注意:

  

228)特别是,使用异常处理的信号处理程序非常   可能有问题。此外,调用std :: exit可能会导致   破坏对象,包括标准库的对象   实现,通常在a中产生未定义的行为   信号处理程序(见1.9)。

根据您引用的规则,在大多数情况下,在main完成后保留一些线程并且所有静态变量都被销毁将导致UB。仅当函数是信号安全且不使用标准库时才允许。