【发布时间】:2010-10-02 11:55:11
【问题描述】:
当我在析构函数中时,是否有其他线程会开始执行对象的成员函数?这种情况该如何处理?
【问题讨论】:
标签: c++ multithreading destructor
当我在析构函数中时,是否有其他线程会开始执行对象的成员函数?这种情况该如何处理?
【问题讨论】:
标签: c++ multithreading destructor
C++ 对在对象被删除后使用它没有内在的保护 - 忘记竞争条件 - 另一个线程可以在你的对象被完全删除后使用它。
要么:
【讨论】:
boost::shared_ptr<> 进行引用计数。它还支持 weak_ptr<> 或 enable_shared_from_this 之类的结构,这使得生命周期管理的一些好的部分变得非常容易。
你不应该破坏一个对象,除非你确定没有其他东西会尝试使用它——理想情况下没有其他东西可以引用它。当您调用 delete 时,您需要更仔细地查看。
【讨论】:
如果您因为异常处理程序中的堆栈展开而处于析构函数中,我建议您重新排列代码,以便在序列化块中捕获异常。
在块之后,您检查对象是否仍然有效并调用您的方法。这样一个线程中的异常,将允许其他线程优雅地处理对析构函数的调用。
【讨论】: