- 主题:boost::asio::basic_socket_acceptor居然在构造函数中抛异常?
构造函数里可以抛异常,只要保证成员的状态正常、已经获得的资源能够正常释放。
我自己从来不在构造函数中抛异常的,也很少在别处自己抛异常,只是处理别人的库的异常。所以有点大惊小怪了。
但实际上自己的构造中也是避免不了异常的,比如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.*
谢谢,学习了。
【 在 z16166 的大作中提到: 】
: 构造函数里可以抛异常,只要保证成员的状态正常、已经获得的资源能够正常释放。
: 比如下面这种,初始化了N个成员后抛了一个异常,可能导致后面的M个成员没初始化,是随机值
: (这M个成员如果都是RAII类型的,编译器会将其安排在前N个中初始化,如果不是,那就是随机值)。
: ...................
--
FROM 216.240.30.*
有意思。都没注意过。
【 在 z16166 的大作中提到: 】
: 发现一个开源库中这个招了,在自己的构造函数中构造basic_socket_acceptor类型的成员对象。
: [upload=1][/upload]
--
FROM 72.199.121.*
貌似没找到BS反对Two-phase Construction的论述
这有本pdf
https://github.com/boydfd/books/blob/master/seeing/stalled/2013%20Stroustrup%20-%20The%20C%2B%2B%20Programming%20Language%204th%20Edition.pdf
【 在 hongdiao 的大作中提到: 】
: 太能扯了, C++引入异常的其中一个目的,就是为了从构造函数中抛出异常来表示构造失败。
: 还引用各种无名氏的文章, 人家C++之父明确的在《C++ programming Language》里面旗帜鲜明的反对二阶段构造。
--
FROM 60.12.138.*
在构造函数里抛异常是正道
--
FROM 122.224.174.*