C ++:析构函数级联期间的回调和系统计时器事件

时间:2010-11-22 06:31:48

标签: c++ timer oop object-destruction

假设一个OO设计,其中对象相互调用,并且一段时间后被调用对象回调启动对象(调用和回调)。在正常的程序终止期间,在调用析构函数时,是否存在某种承诺,即不会调用任何系统计时器,并且没有对象会启动回调?

4 个答案:

答案 0 :(得分:2)

不,没有这样的保证。

您需要编写代码,以便在完成使用之前不会销毁对象。

答案 1 :(得分:2)

有一个非常棒的库来处理这些类型的调用,当然它是一个Boost。

Behold Boost.Signals2,即使在多线程应用程序中也保证正确:)

特别注意boost::trackable类的使用,以便对象破坏在调用发生之前自动使调用无效。

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

答案 2 :(得分:1)

  • boost的weak_ptr通常可以帮助避免从回调中访问被破坏的对象,因此也可能在终止期间。使用它时,需要回调的所有对象都需要shared_ptr。
  • 调用函数/回调的定时器通常是高端库,因此它取决于它们是否支持stopAllTimers()功能。如果您可以控制库,那么实现它可能并不太难,但您仍然需要知道何时触发它。

答案 3 :(得分:1)

不,没有承诺。

有两种方法可以解决这个问题:

  • 具有对象可以在销毁时调用的注销功能,这可以保证在终止后不会调用回调 - CancelAllCallbacks()或类似的。

  • 有一个弱引用机制,例如已经提到过的weak_ptr,只有在成功获得强引用的情况下才能调用回调。

通常第一个选项是足够的,除非可以异步调度或调用回调 - 那么你没有同步方法来阻止已经调度的调用被调用,或者实际上现在被调用(或者在不同的主题中,从现在起很少说明。