2010-11-22 40 views

回答

2

有一個非常棒的庫來處理這些類型的調用,當然這是一個提升。

看哪Boost.Signals2,它們發生之前,即使是在多線程應用程序:)特別採用boost::trackable

注意正確性的保證,使物體破壞自動失效的電話。

注:Boost.Signals(祖先)具有幾乎相同的功能,但不是線程安全

2

不,沒有這樣的保證。

您需要編寫代碼,以便在完成使用之前不會銷燬對象。

+0

是,如果不小心合適的對象的描述的場景往往會導致程序出現故障清理。 – sharptooth 2010-11-22 06:39:10

1
  • boost的weak_ptr可以幫助避免從一般的回調中訪問被破壞的對象,所以也可能在終止時訪問。當使用這個時,需要回調的所有對象都需要一個shared_ptr。
  • 定時器調用函數/回調通常是高端庫,所以它取決於它們是否支持stopAllTimers()功能。如果你對圖書館有控制權,實施起來可能並不難,但你仍然需要知道何時觸發它。
1

不,沒有承諾。

有兩種方式來處理這個問題:

  • 有一個註銷功能,對象可以破壞調用,這保證它終止之後沒有回調將被調用 - CancelAllCallbacks()或相似。

  • 有一個弱引用機制,例如已經提到的weak_ptr,只有在成功獲得強引用時才調用回調。

通常情況下,第一個選項是足夠的,除非回調可定期或異步調用 - 那麼你不必防止已計劃要調用的回調同步的方式,或實際上是在被稱爲現在(或從現在開始的幾條指令)在不同的線程中。