在析构函数中调用观察者是不是不好的做法?

Is it bad practice to call an observer in a destructor?

本文关键字:是不是 析构函数 调用 观察者      更新时间:2023-10-16

我有一个对象,当一组任务完成时发送一个信号。这些任务在线程池中独立执行。我想在组中的所有任务完成时向观察者发送通知。

本质上这归结为一个引用计数方案。当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++标准)的情况下这样做。特别是:

  • 确保异常被处理,这样就不会有异常从析构函数中传播出去