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
将明确表示没有副作用。这可能包括内存取消分配

这些是标准库为您提供的保证