构造函数里可以抛异常,只要保证成员的状态正常、已经获得的资源能够正常释放。
我自己从来不在构造函数中抛异常的,也很少在别处自己抛异常,只是处理别人的库的异常。所以有点大惊小怪了。
但实际上自己的构造中也是避免不了异常的,比如std::string构造时就可能抛bad_alloc异常,只不过一般都不处理这个异常,任其崩掉好了。
比如下面这种,初始化了N个成员后抛了一个异常,可能导致后面的M个成员没初始化,是随机值
(这M个成员如果都是RAII类型的,编译器会将其安排在前N个中初始化,如果不是,那就是随机值)。
ctor::ctor(){
初始化N个成员变量; // 包括用成员列表初始化的
throw;
初始化M个成员变量;
}
class ctor {
public:
ctor() : a{0} {
throw;
c = new char[100];
}
~ctor() { delete[] c; }
private:
int a;
std::string b;
char *c;
};
int main() {
try {
ctor c;
} catch ([[maybe_unused]] std::exception &e) {
}
basic_socket_acceptor这个貌似只有一个成员impl_,在抛异常之前已经初始化了,没啥问题。
需要使用者知道这里面会抛异常,不注意的话,就坑了。如下:
ctor::ctor(){
初始化N个成员变量;
m_acceptor = basic_socket_acceptor{io_service_, endpoint(ip_, port_)};
初始化M个成员变量;
}
【 在 cjohny 的大作中提到: 】
: 问个小白问题:为啥不能在构造函数里面抛异?
--
修改:z16166 FROM 60.12.138.*
FROM 60.12.138.*