我正在寻找"信号处理程序中不允许的对象或函数的定义" 。它在秒中使用。 N3797的3.6.3 / 4:
如果使用标准库对象或功能 在信号处理程序中允许(18.10)以前没有发生过 (1.10)用静态存储器完成对物体的破坏 持续时间和执行std :: atexit注册函数(18.5),. 程序有不确定的行为。
一般来说,我想找到这个UB规则的一个例子。
答案 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。仅当函数是信号安全且不使用标准库时才允许。