9

当我在析构函数中时,是否有其他线程将开始执行对象的成员函数?如何处理这种情况?

4

3 回答 3

17

C++ 没有内在的保护来防止在对象被删除后使用它——忘记竞争条件——另一个线程可以在你的对象被完全删除后使用它。

任何一个:

  1. 确保代码中只有一个地方拥有该对象,并且在没有人使用该对象时负责删除。
  2. 使对象引用计数 - 通过添加显式引用计数代码,或找到实现引用计数的适当基类
于 2009-01-20T16:29:55.767 回答
15

除非您确定没有其他东西会尝试使用它,否则您不应该破坏一个对象 - 理想情况下,没有其他东西可以引用它。当您调用 delete 时,您需要更仔细地查看。

于 2009-01-20T16:17:55.433 回答
2

如果您由于异常处理程序中的堆栈展开而处于析构函数中,我建议您重新排列代码,以便在序列化块中捕获异常。

在块之后,您检查对象是否仍然有效并调用您的方法。这样一个线程中的异常将允许其他线程优雅地处理对析构函数的调用。

于 2009-01-20T16:36:55.877 回答