假設一個OO設計,對象互相調用,一段時間後被調用的對象回調啓動對象(調用和回調)。在正常程序終止時,雖然析構函數被調用,但是有沒有系統定時器會被調用,並且沒有對象會發起回調?C++:析構函數級聯中的回調函數和系統定時器事件
1
A
回答
2
有一個非常棒的庫來處理這些類型的調用,當然這是一個提升。
看哪Boost.Signals2,它們發生之前,即使是在多線程應用程序:)特別採用boost::trackable
類
注意正確性的保證,使物體破壞自動失效的電話。
注:Boost.Signals(祖先)具有幾乎相同的功能,但不是線程安全
2
不,沒有這樣的保證。
您需要編寫代碼,以便在完成使用之前不會銷燬對象。
1
- boost的weak_ptr可以幫助避免從一般的回調中訪問被破壞的對象,所以也可能在終止時訪問。當使用這個時,需要回調的所有對象都需要一個shared_ptr。
- 定時器調用函數/回調通常是高端庫,所以它取決於它們是否支持stopAllTimers()功能。如果你對圖書館有控制權,實施起來可能並不難,但你仍然需要知道何時觸發它。
1
不,沒有承諾。
有兩種方式來處理這個問題:
有一個註銷功能,對象可以破壞調用,這保證它終止之後沒有回調將被調用 -
CancelAllCallbacks()
或相似。有一個弱引用機制,例如已經提到的weak_ptr,只有在成功獲得強引用時才調用回調。
通常情況下,第一個選項是足夠的,除非回調可定期或異步調用 - 那麼你不必防止已計劃要調用的回調同步的方式,或實際上是在被稱爲現在(或從現在開始的幾條指令)在不同的線程中。
相關問題
- 1. C++中構造函數和析構函數的內聯使用
- 2. C++中的定時器回調函數
- 3. 在C++中,構造函數和析構函數可以是內聯函數嗎?
- 4. 構造函數和析構函數 - C++
- 5. C++中的構造函數和析構函數與C#比較
- 6. C中的析構函數和構造函數C
- 7. python中的回調函數和事件
- 8. C++:不內聯時,構造函數/析構函數未解析嗎?
- 9. C++中的析構函數調用
- 10. 在C庫函數中調用系統
- 11. C++ 2構造函數和類中的析構函數
- 12. C中的析構函數#
- 13. C++中的析構函數
- 14. C++中的析構函數
- 15. 程序集分析系統()中調用的函數C
- 16. C++類構造函數/析構函數
- 17. 事件回調中的調用函數
- 18. 調用繼承構造函數/析構函數的順序,C++
- 19. 默認構造函數和析構函數是否內聯?
- 20. C#構造函數事件
- 21. 在C++中調用析構函數
- 22. C++函數指針和回調函數
- 23. Linux下C++系統()調用崩潰時,函數返回
- 24. 在C#中調用C dll函數,結構體和回調函數
- 25. C++中的析構函數和繼承?
- 26. C++中構造函數,複製構造函數,析構函數序列中的額外析構函數
- 27. 沒有析構函數的C++函數
- 28. 構造函數和析構函數
- 29. 析構函數和構造函數
- 30. 成員構造函數和析構函數調用的順序
是,如果不小心合適的對象的描述的場景往往會導致程序出現故障清理。 – sharptooth 2010-11-22 06:39:10