我有一个对象在一组任务完成时发送信号。这些任务在线程池中独立执行。我希望在一个组中的所有任务完成后向观察者发送通知。
基本上,这归结为引用计数方案。当ref = 0时,我发送通知。其中一个实现是利用提升智能指针(或任何自动引用计数)。
class TaskCompletionNotifier {
~TaskCompletionNotifier() {
_listener->notify();
}
setListener(listener);
Listener _listener;
}
class Task {
boost::shared_ptr<TaskCompletionNotifier> _notifier;
}
我的问题是,在对象的析构函数中执行此调用是不好的做法吗?
答案 0 :(得分:3)
这本身就不好吗?否。
是否会引发潜在的陷阱?是。
请确保您不允许任何例外以逃避析构函数,并且最好确保_listener->notify()
不会最终修改此对象的任何成员数据:它是安全的和好的如果确实如此,但可能会让您的析构函数的关闭逻辑混乱和/或搞乱。
除此之外,去吧。
答案 1 :(得分:-4)
在析构函数中调用观察者是不好的做法?
没有。事实并非如此。
但它为许多陷阱开辟了潜力,因此请确保在不违反C ++规则(C ++标准)的情况下这样做。特别是: