为什么我的析构函数中的异常没有触发 std::终止?
Why is my exception-in-destructor not triggering std::terminate?
我很清楚这样一个事实,即不应该在析构函数中抛出任何异常。
但作为掌握这个概念的一部分,我编写了这个例子:-
#include <iostream>
class A {
private:
int i;
public:
A() { i = 10; }
~A() { throw 30; }
};
int main(){
try{
A();
throw 10;
}
catch (int i) {
std::cout << i << std::endl;
std::cout << "exception caught" << std::endl;
}
}
根据我的理解,该程序应该通过调用 std::terminate() 来终止,因为同时会有两个异常。但是,该程序给出以下输出:-
30
exception caught
谁能解释一下为什么这没有终止背后的逻辑?
如果在堆栈展开过程中抛出异常,将调用std::terminate
。这意味着,如果在处理另一个异常时调用异常,则将调用std::terminate
。
在您的示例中,这不会发生 -A();
将构造并立即销毁A
实例。然后,throw 30
将被正确捕获。
将代码更改为:
int main(){
try{
A a; // begin `a` lifetime
throw 10; // | throw #0
// | end `a` lifetime
// throw #1
}
catch(int i){
cout<<i<<endl;
cout<<"exception caught"<<endl;
}
}
将保证调用std::terminate
。在这种情况下,a
将被销毁,并在处理另一个异常时抛出。
活科里鲁示例
附加信息:
cpp 首选项/析构函数/异常
StackOverflow:"从析构函数中抛出异常">
请注意,在 C++11 及更高版本中,您的代码片段将调用std::terminate
并为您提供警告:
main.cpp: 在析构函数 'A::~A()' 中:
主.cpp:16:15: 警告:抛出将始终调用终止() [-终止]
throw 30; ^~
主.cpp:16:15:注意:在 C++11 中,析构函数默认为 noexcept
抛出"int"实例后调用的终止
bash:第 7 行:1505 中止(核心转储)./a.out
如编译器输出所示,由于 C++11析构函数隐式noexcept(true)
.如果要防止此行为,只需将它们标记为noexcept(false)
.例:
~A() noexcept(false)
{
throw 30;
}
科里鲁的现场例子
在您的示例中,A()
构造一个临时变量,然后立即销毁它A
。因此,throw 10;
永远不会被执行。
throw
发生的语句位于A
的析构函数中。当执行A::~A()
时,程序不会在这一点上展开(即从异常中清除状态)。例如,请参阅"抛出的析构函数"。
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 我收到以下错误:抛出'std::bad_alloc'实例后终止调用
- 在输入句子时终止 std::out_of_range
- 在抛出 'std::runtime_error' 的实例后终止调用 what(): Filebuf 和 ostream 的 I/O 错误
- 在抛出 what() 的实例后调用'std::logic_error'终止:basic_string::_M_construct 空无效
- 抛出实例'std::out_of_range'后调用的终止
- std::使用迭代器映射查找距离,程序不会终止
- 在抛出 'std::invalid_argument' 的实例后终止调用 what(): stoi (找不到问题所在)
- 在抛出"std::out_of_range"的实例后调用的 C++ 终止 std::vector
- C++程序问题:抛出'std::invalid_argument'实例后终止调用
- 在使用标准向量函数时引发'std::bad_alloc'实例后调用的终止
- 获取错误:在抛出"std::bad::alloc"的实例后终止调用 what(): std::bad_alloc
- C++ 终止称为"std::length_error"?
- C++终止错误'std::bad_alloc'
- 在抛出 'std::bad_weak_ptr' 的实例后终止调用 what(): bad_weak_ptr?
- 为什么调用shared_from_this调用 std::终止
- 抛出 'std::logic_error' basic_string::_S_construct null 无效的实例后调用的终止
- 如何终止 std::cin.get() 的 ''
- 为什么我的析构函数中的异常没有触发 std::终止?
- 从保护类析构函数引发异常会导致 std::终止