假设一个OO设计,其中对象相互调用,并且一段时间后被调用对象回调启动对象(调用和回调)。在正常的程序终止期间,在调用析构函数时,是否存在某种承诺,即不会调用任何系统计时器,并且没有对象会启动回调?
答案 0 :(得分:2)
不,没有这样的保证。
您需要编写代码,以便在完成使用之前不会销毁对象。
答案 1 :(得分:2)
有一个非常棒的库来处理这些类型的调用,当然它是一个Boost。
Behold Boost.Signals2,即使在多线程应用程序中也保证正确:)
特别注意boost::trackable
类的使用,以便对象破坏在调用发生之前自动使调用无效。
注意:Boost.Signals(它的祖先)具有几乎相同的功能,但不是线程安全的
答案 2 :(得分:1)
答案 3 :(得分:1)
不,没有承诺。
有两种方法可以解决这个问题:
具有对象可以在销毁时调用的注销功能,这可以保证在终止后不会调用回调 - CancelAllCallbacks()
或类似的。
有一个弱引用机制,例如已经提到过的weak_ptr,只有在成功获得强引用的情况下才能调用回调。
通常第一个选项是足够的,除非可以异步调度或调用回调 - 那么你没有同步方法来阻止已经调度的调用被调用,或者实际上现在被调用(或者在不同的主题中,从现在起很少说明。