[英]Is it safe to emit a sigc++ signal in a destructor?
我當前的項目有一個跟蹤/代理C ++對象的機制,以便將它們安全地暴露給腳本環境。 它的一部分功能是在C ++對象被銷毀時被通知,因此它可以安全地清除腳本環境中對該對象的引用。
為此,我定義了以下類:
class DeleteEmitter {
public:
virtual ~DeleteEmitter() {
onDelete.emit();
}
sigc::signal<void> onDelete;
};
然后我有任何可能需要暴露給從該類繼承的腳本環境的類。 當調用代理層時,它將回調連接到onDelete信號,因此在對象被銷毀時被通知。
光測試表明這是有效的,但在實時測試中,我看到了代碼中不相關部分的特殊內存損壞(讀取:malloc / free崩潰)。 在valgrind下運行表明在釋放對象后可能會有一個雙重釋放或繼續使用它,因此可能在類中存在一個舊的錯誤,該錯誤僅在將DeleteEmitter添加到其繼承層次結構后才會被暴露。
在我的調查過程中,我發現在析構函數中發出sigc ++信號可能不安全。 顯然,如果回調試圖使用被刪除的對象,那將是一件壞事,但我可以確認這不是這里發生的事情。 假設有人知道這是否安全? 是否有更常見的模式來實現相同的結果?
c ++規范保證在析構函數返回之前不會銷毀對象中的數據成員,因此onDelete
對象在此時不會受到影響。 如果您確信信號不會間接導致對被銷毀對象的任何讀取,寫入或方法調用(如果DeleteEmitter
是另一個對象的一部分, DeleteEmitter
多個對象)或生成C ++異常,那么它是“安全的” “。 當然,假設您不在多線程環境中,在這種情況下,您還必須確保其他線程不會干擾。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.