簡體   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