【发布时间】:2012-04-26 19:27:56
【问题描述】:
我是 C++ 的新手(来自 C)。我从概念上理解 RAII 应该如何工作,但我无法在其中安装一个简单的套接字连接处理程序。
当前代码:
void accept_ev(event_handler::token &t, int listenfd)
{
int newfd = accept(listenfd, NULL, NULL);
if (newfd < 0)
throw api_server_accept_failed(*this, errno);
connections.insert(api_server_connection(newfd));
}
这显然不安全,因为 api_server_connection 构造函数可能会在将 fd 分配给其成员变量之前引发异常。
所以我的下一个想法是将接受移动到构造函数中。问题是我真的希望 api_server_connection 不知道 fd 的来源。例如。如果我以后想支持inetd,它也可以像fd 0一样传递到程序中。
那么我该怎么做。我应该为每种获取 fd 的方式使用不同的构造函数吗?我应该做子类吗?另一种选择可能是有一个 lambda 函数?
或者在这种情况下我应该抓住任何错误并关闭调用者中的 fd 吗?
【问题讨论】:
-
你看过/读过Boost ASIO是如何工作的吗? (你有没有考虑过完全跳过这个而只使用 ASIO?)
-
api_server_connection如何引发异常?您还没有向我们展示该代码。 -
@R.MartinhoFernandes 我还没写……但我知道它会有 pimpl,这意味着内存分配,可能会失败。
-
@JerryCoffin 我没有,但这个问题并不是关于套接字(我犹豫是否添加那个标签),而是关于 RAII。