我知道从信号处理程序直接或间接调用mallocfree是不安全的。

但是,如果我可以保证至少有一个共享引用仍然存在,那么复制,构造和销毁其他共享或弱引用是否安全,还是我必须进行自己的引用计数?

(是的,我知道信号处理程序通常不应该做太多事情。但是这次我有充分的理由。)

最佳答案

C++标准定义了“普通功能”的概念,如下所示:



此外:



显然,C++类对象不是C/C++通用子集的一部分,因此在信号处理程序中使用它们会产生实现定义的行为。

现在,许多实现将允许您有限地使用C++功能。如果您的实现不允许内存分配或异常,那么这就是我们对这些智能指针类型的了解。

然后,所有 weak_ptr constructors被明确声明为noexcept。所以他们不能抛出异常。这也意味着不允许他们分配内存(因为分配内存失败会引发异常)。是的,如果失败,他们可以分配内存和std::terminate,但是对于实现而言这是非常不礼貌的。

copy&move constructors of shared_ptr 同样是noexcept,因此同样适用。对于shared_ptr的别名构造函数也是如此。

如果您绝对确定至少还有一个shared_ptr仍然存在,那么明确声明销毁shared_ptr不会产生副作用。其中可能包括内存释放。

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

10-07 20:01