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

时间:2014-03-20 18:12:32

标签: c++

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

基本上,这归结为引用计数方案。当ref = 0时,我发送通知。其中一个实现是利用提升智能指针(或任何自动引用计数)。

class TaskCompletionNotifier {
  ~TaskCompletionNotifier() {
    _listener->notify();
  }

  setListener(listener);

  Listener _listener;
}

class Task {
  boost::shared_ptr<TaskCompletionNotifier> _notifier; 
}

我的问题是,在对象的析构函数中执行此调用是不好的做法吗?

2 个答案:

答案 0 :(得分:3)

这本身就不好吗?否。

是否会引发潜在的陷阱?是。

请确保您不允许任何例外以逃避析构函数,并且最好确保_listener->notify()不会最终修改此对象的任何成员数据:它是安全的好的如果确实如此,但可能会让您的析构函数的关闭逻辑混乱和/或搞乱。

除此之外,去吧。

答案 1 :(得分:-4)

  

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

没有。事实并非如此。

但它为许多陷阱开辟了潜力,因此请确保在不违反C ++规则(C ++标准)的情况下这样做。特别是:

  • 确保处理异常,以便不会从析构函数中传播异常