我有一个对象,当一组任务完成时发送一个信号。这些任务在线程池中独立执行。我想在组中的所有任务完成时向观察者发送通知。
本质上这归结为一个引用计数方案。当ref=0时,我发送通知。其中一个实现是利用boost智能指针(或任何refcount auto)。
class TaskCompletionNotifier {
~TaskCompletionNotifier() {
_listener->notify();
}
setListener(listener);
Listener _listener;
}
class Task {
boost::shared_ptr<TaskCompletionNotifier> _notifier;
}
我的问题是,在对象的析构函数中执行这个调用是不好的做法吗?
这本身就不好吗?没有。
它是否打开了潜在的陷阱?是的。
确保不允许任何异常逃离析构函数,并且最好确保_listener->notify()
最终不会修改该对象的任何成员数据:安全, ok 如果修改了,但可能会使析构函数的关闭逻辑混乱和/或混乱。
在析构函数中调用观察者是不是不好的做法?
。它不是。
但是它打开了许多潜在的陷阱,所以确保你在不违反c++规则(c++标准)的情况下这样做。特别是:
- 确保异常被处理,这样就不会有异常从析构函数中传播出去