![]() |
1
20
是的,这是合法的。不能有例外 逃跑
(从技术上讲,异常也可以从析构函数调用中转义。如果在堆栈展开过程中由于引发了另一个异常而发生这种情况,
|
![]() |
2
4
以标准库中的std::fstream类为例。
其概念是,如果析构函数调用任何可以抛出的方法,那么这些方法应该是公共的。因此,如果对象的用户想要检查异常,他们可以使用公共方法来处理异常。如果他们不关心异常,那么就让析构函数处理这个问题。
|
![]() |
3
2
当没有进行堆栈展开时,异常可以在不调用std::terminate()的情况下离开析构函数。但是,对于在堆上分配的对象,这将导致内存泄漏,因为将异常抛出其析构函数的对象不会调用“运算符删除”。令人惊讶的是,在这种情况下仍然会调用基类的析构函数: What happens to base class destructor if a derived class destructor throws an exception 如果异常在析构函数内部被捕获(以便异常不会离开析构函数),那么即使另一个异常的堆栈展开正在进行,也没有问题。下面将更深入地描述该案例: http://bin-login.name/ftp/pub/docs/programming_languages/cpp/cffective_cpp/MEC/MI11_FR.HTM |
![]() |
4
0
答案很简单,决不允许dtor出现异常!
更复杂的是,大多数想要保证其异常安全性的函数,主要是基本保证或强保证,依赖于自身的底层类型,而不是抛出它们的dtor* 真正的问题是,当这个错误发生时,您的程序将处于什么状态?你怎样才能恢复?这种恢复应该在哪里进行?你需要看看你的具体案例,解决这些问题。有时候捕捉异常并忽略它是很好的。其他时候,你需要发出一些危险信号。 所以答案是:C++允许在dtor中抛出异常,但不应该允许它转义。 *这里有一个简短的介绍 synopsis article )
|
|
lfox · 如果列中不存在某个值,则停止代码执行 2 年前 |
![]() |
zaen · 将值传递到异常字符串消息中 2 年前 |
![]() |
Zephyr · 如何在双ListView选择系统上实现过滤器? 6 年前 |
![]() |
Aave · 错误数组长度的特定异常 6 年前 |