C++ 在析构函数中抛出异常-有什么缺点?

C++ 在析构函数中抛出异常-有什么缺点?,c++,C++,在析构函数中抛出异常的缺点是什么 现在我能看到的唯一缺点是它可能会停止释放资源,这还有其他缺点吗?如果解绕堆栈以处理另一个异常而调用析构函数,则抛出将终止程序-一次不能有多个未处理的异常 如果数组元素的析构函数抛出,则不会调用其余元素的析构函数。这可能会导致内存泄漏和其他问题 抛出析构函数使提供异常保证变得困难或不可能。例如,“复制和交换”习惯用法用于实现具有强异常保证的赋值(即,如果抛出异常,则任何内容都未更改的保证)将失败: thing & thing::operator=(thin

在析构函数中抛出异常的缺点是什么


现在我能看到的唯一缺点是它可能会停止释放资源,这还有其他缺点吗?

如果解绕堆栈以处理另一个异常而调用析构函数,则抛出将终止程序-一次不能有多个未处理的异常

如果数组元素的析构函数抛出,则不会调用其余元素的析构函数。这可能会导致内存泄漏和其他问题

抛出析构函数使提供异常保证变得困难或不可能。例如,“复制和交换”习惯用法用于实现具有强异常保证的赋值(即,如果抛出异常,则任何内容都未更改的保证)将失败:

thing & thing::operator=(thing const & t) {
    // Copy the argument. If this throws, there are no side-effects.
    thing copy(t);

    // Swap with this. Must have (at least) a strong guarantee
    this->swap(copy);
    // Now the operation is complete, so nothing else must throw.

    // Destroy the copy (now the old value of "this") on return.
    // If this throws, we break the guarantee.
    return *this;
}

如果解绕堆栈以处理另一个异常而调用析构函数,则抛出将终止程序-一次不能有多个未处理的异常

如果数组元素的析构函数抛出,则不会调用其余元素的析构函数。这可能会导致内存泄漏和其他问题

抛出析构函数使提供异常保证变得困难或不可能。例如,“复制和交换”习惯用法用于实现具有强异常保证的赋值(即,如果抛出异常,则任何内容都未更改的保证)将失败:

thing & thing::operator=(thing const & t) {
    // Copy the argument. If this throws, there are no side-effects.
    thing copy(t);

    // Swap with this. Must have (at least) a strong guarantee
    this->swap(copy);
    // Now the operation is complete, so nothing else must throw.

    // Destroy the copy (now the old value of "this") on return.
    // If this throws, we break the guarantee.
    return *this;
}

当另一个异常处于活动状态(未捕获)时抛出异常会导致程序立即终止。请给出一个您认为是好方法的示例idea@Rob我认为这不是一个好主意,但我不明白为什么不是,这就是我问的原因。Joker有一个很好的指针Joker的要点是:传播异常时会自动调用析构函数,在抛出时抛出析构函数可能会导致抛出。@leewangzhong:这是一个点,但不是点;避免抛出析构函数还有其他原因。原则上,您可以构造逻辑,或者选中
std::uncaught_exception()
,这样您就可以从析构函数中抛出异常,而不会有终止程序的风险。在另一个异常处于活动状态(未捕获)时抛出异常导致程序立即终止。请举例说明您认为这是一个好方法idea@Rob我认为这不是一个好主意,但我不明白为什么不是,这就是我问的原因。Joker有一个很好的指针Joker的要点是:传播异常时会自动调用析构函数,在抛出时抛出析构函数可能会导致抛出。@leewangzhong:这是一个点,但不是点;避免抛出析构函数还有其他原因。原则上,您可以构造逻辑,或者检查
std::uncaught_exception()
,这样您就可以从析构函数中抛出,而不会有终止程序的风险。