我知道从信号处理程序直接或间接调用malloc
或free
是不安全的。
但是,如果我可以保证至少有一个共享引用仍然存在,那么复制构造和销毁其他共享或弱引用是否安全,或者我是否必须自行引用引用计数?
(是的,我知道信号处理程序通常不应该做太多。但这次我有充分的理由。)
答案 0 :(得分:6)
C ++标准定义了"普通旧函数的概念"如下:
POF(“普通旧函数”)是仅使用来自[C / C ++]公共子集的特征的函数,并且不直接或间接使用任何非POF的函数,除了它可能使用普通的无锁原子操作。
此外:
除了用作C ++程序中的信号处理程序的POF之外的任何函数的行为都是实现定义的。
显然,C ++类对象不是C / C ++公共子集的一部分,因此在信号处理程序中使用它们会产生实现定义的行为。
现在,许多实现都允许您限制使用C ++功能。如果您的实现不允许内存分配或异常,那么这就是我们对这些智能指针类型的了解。
然后显式声明所有weak_ptr
constructors noexcept
。所以他们不能抛出异常。这也意味着他们不允许分配内存(因为无法分配内存会引发异常)。是的,他们可以分配内存和std::terminate
如果失败,但这对于实现来说是非常粗鲁的。
copy&move constructors of shared_ptr
同样是noexcept
,因此同样适用。对于shared_ptr
的别名构造函数也是如此。
如果您绝对确定至少有一个shared_ptr
仍然存在,那么明确声明销毁shared_ptr
没有副作用。其中可能包括内存取消分配。
这些是标准库为您提供的保证。