繁体   English   中英

在信号处理程序中使用`std :: shared_ptr`和`std :: weak_ptr`是否安全?

[英]Is it safe to use `std::shared_ptr` and `std::weak_ptr` in a signal handler?

我知道malloc free ,或者直接或间接地从信号处理程序中free调用。

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

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

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

POF(“普通旧函数”)是仅使用来自[C / C ++]公共子集的特征的函数,并且不直接或间接使用任何非POF的函数,除了它可以使用普通锁定 - 免费的原子操作。

此外:

除了用作C ++程序中的信号处理程序的POF之外的任何函数的行为都是实现定义的。

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

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

然后,所有weak_ptr构造函数都显式声明为noexcept 所以他们不能抛出异常。 这也意味着它们不被允许分配内存(因为无法分配内存会引发异常)。 是的,如果失败,他们可以分配内存和std::terminate ,但这对于实现来说是非常粗鲁的。

shared_ptr复制和移动构造函数同样是noexcept ,因此同样适用。 对于shared_ptr的别名构造函数也是如此。

如果您完全确定至少有一个shared_ptr仍然存在,则明确声明销毁shared_ptr没有副作用。 其中可能包括内存取消分配。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM