C++ 在信号处理程序中使用'std::shared_ptr'和'std::weak_ptr'安全吗?
我知道直接或间接地从信号处理程序调用C++ 在信号处理程序中使用'std::shared_ptr'和'std::weak_ptr'安全吗?,c++,c++11,signal-handling,C++,C++11,Signal Handling,我知道直接或间接地从信号处理程序调用malloc或free是不安全的 但是,如果我可以保证至少有一个共享引用将保持活动状态,那么复制构造并销毁其他共享或弱引用是否安全,或者我是否必须滚动自己的引用计数 (是的,我知道信号处理程序通常不应该做很多事情。但是这次我有一个很好的理由。)< /P> < P> C++标准定义了一个“普通的老函数”的概念如下: POF(“普通旧函数”)是一种仅使用[C/C++]公共子集中的功能的函数,它不直接或间接使用任何非POF的函数,除非它可以使用普通的无锁原子操作 此
malloc
或free
是不安全的
但是,如果我可以保证至少有一个共享引用将保持活动状态,那么复制构造并销毁其他共享或弱引用是否安全,或者我是否必须滚动自己的引用计数
(是的,我知道信号处理程序通常不应该做很多事情。但是这次我有一个很好的理由。)< /P> < P> C++标准定义了一个“普通的老函数”的概念如下:
POF(“普通旧函数”)是一种仅使用[C/C++]公共子集中的功能的函数,它不直接或间接使用任何非POF的函数,除非它可以使用普通的无锁原子操作 此外:在C++程序中用作POF的任何函数以外的函数的行为是定义实现。
显然,C++类对象不是C/C++公共子集的一部分,因此在信号处理程序中使用它们可以实现实现定义的行为。现在,许多实现将允许您使用C++特性的有限。如果您的实现不允许内存分配或异常,那么下面是我们对这些智能指针类型的了解
然后显式声明所有的noexcept
。所以他们不能抛出异常。这也意味着不允许他们分配内存(因为分配内存失败会引发异常)。是的,如果失败,他们可以分配内存并终止,但是对于一个实现来说,这样做是非常不礼貌的
类似的是noexcept
,因此同样适用。对于共享\u ptr
的别名构造函数也是如此
如果您绝对确定至少有一个共享\u ptr
仍将存在,则销毁共享\u ptr
将明确表示没有副作用。这可能包括内存取消分配
这些是标准库为您提供的保证