如果析构函数吐出异常,可能导致不明确行为,如下面 vector 销毁时会调用所有元素的析构函数,这会导致不明确行为
class A {
...
~A() {...} // 假设析构函数会吐出异常
};
void f() {
std::vector<A> v;
...
}
关闭资源时经常会遇到类似问题,如处理数据库连接时为了方便做封装,就可能导致析构吐出异常
class DBConnection {
public:
static DBConnection create();
void close();
}
class DBManager {
public:
...
~DBManager() {
db.close(); // 可能有异常逃离析构
}
private:
DBConnection db;
}
{
DBManager db(DBConnection::create());
}
~DBManager() {
try { db.close(); }
catch (...) {
log();
std::abort(); // 明确终止
}
}
~DBManager() {
try { db.close(); }
catch (...) {
log(); // 直接吞掉异常
}
}
class DBManager {
public:
...
~DBManager() {
if (!closed) {
try {
db.close();
}
catch (...) {
log();
}
}
}
void close() // 由客户显式调用,自行处理异常
{
db.close();
closed = true;
}
private:
DBConnection db;
bool closed;
}
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- ryyc.cn 版权所有 湘ICP备2023022495号-3
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务