在析构函数中调用观察者是不是不好的做法?
Is it bad practice to call an observer in a destructor?
我有一个对象,当一组任务完成时发送一个信号。这些任务在线程池中独立执行。我想在组中的所有任务完成时向观察者发送通知。
本质上这归结为一个引用计数方案。当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++标准)的情况下这样做。特别是:
- 确保异常被处理,这样就不会有异常从析构函数中传播出去
相关文章:
- 为什么这里不调用析构函数
- 为什么在运算符删除中不调用析构函数?
- 递归导致程序崩溃,但 while 循环中的相同概念不是来自C++析构函数
- 如果引用应该保留,不删除析构函数中的指针会导致内存泄漏吗?
- 单例:为什么不需要删除并且看不到析构函数调试消息
- 为什么移动运算符不只是析构函数+移动构造函数
- 我不明白析构函数有什么问题?
- 从 std::streambif 继承时不兼容析构函数编译器警告
- 可观察行为和未定义行为 -- 如果我不调用析构函数会发生什么?
- std::unique_ptr的自定义deleter是手动调用析构函数的有效位置吗
- 为什么C++ std::list::clear() 不调用析构函数
- c++中的Guard,在main中未处理异常时不调用析构函数
- 删除类数组而不调用析构函数
- 移动构造函数不调用析构函数
- 删除 void 指针时不调用析构函数
- 为什么在删除析构函数时调用析构函数,如果未删除则不调用析构函数?
- 在构造函数中引发异常时不调用析构函数
- 为什么在数组创建期间抛出未捕获的异常时不调用析构函数C++?
- 这是谁的析构函数
- 当类的指针实例超出范围时不调用析构函数是真的吗?