簡體   English   中英

在析構函數中發出sigc ++信號是否安全?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM