Poco::Net::HTTPClientSession 没有 unique_ptr 抛出异常
Poco::Net::HTTPClientSession throw exception without unique_ptr
我有两个版本的代码:
// HTTP.h
class HTTP
{
private:
//unique_ptr<HTTPClientSession> session;
HTTPClientSession session;
bool doRequest(Poco::Net::HTTPRequest& request, const string& path, const string& content, string& responseBody);
public:
HTTP(const string& adress);
}
// HTTP.cpp
HTTP::HTTP(const string& adress)
{
Poco::URI uri(
adress.substr(0, 4) == "http" ? adress : "http://" + adress
);
//session = make_unique<HTTPClientSession>(uri.getHost(), uri.getPort());
HTTPClientSession session{ uri.getHost(), uri.getPort() };
}
bool HTTP::doRequest(HTTPRequest& request, const string& path, const string& content, string& responseBody) {
...
session.setTimeout(Timespan(5, 0));
//std::ostream& requestStream = session->sendRequest(request);
std::ostream& requestStream = session.sendRequest(request);
...
}
如果我使用 unique_ptr 创建会话对象,就像在注释代码中一样,一切都很好。
但是如果我只使用简单的变量,就像在当前版本中一样。
然后行
session.sendRequest(请求)
抛出异常连接被拒绝
我不明白为什么?
你能解释一下吗?
P.S。 request 对静态资源的简单 HTTP GET 请求。
HTTP::HTTP(const string& adress)
{
Poco::URI uri(
adress.substr(0, 4) == "http" ? adress : "http://" + adress
);
HTTPClientSession session{ uri.getHost(), uri.getPort() };
}
此构造函数的最后一行创建了一个名为 session
的局部变量,...在构造函数 returns 时立即销毁,与 class 无关同一成员的成员。
因此,当一切都说完之后,这个 class 实例的 session
成员仍未初始化。出于比较目的:
session = HTTPClientSession{ uri.getHost(), uri.getPort() };
这将正确地初始化 class 成员,而不是像您明显的意图那样。但是,由于 HTTPClientSession 没有可用的赋值运算符,您唯一的选择是继续使用 unique_ptr
,或者重构构造函数,以便它在其初始化列表中构造 class 成员。
我有两个版本的代码:
// HTTP.h
class HTTP
{
private:
//unique_ptr<HTTPClientSession> session;
HTTPClientSession session;
bool doRequest(Poco::Net::HTTPRequest& request, const string& path, const string& content, string& responseBody);
public:
HTTP(const string& adress);
}
// HTTP.cpp
HTTP::HTTP(const string& adress)
{
Poco::URI uri(
adress.substr(0, 4) == "http" ? adress : "http://" + adress
);
//session = make_unique<HTTPClientSession>(uri.getHost(), uri.getPort());
HTTPClientSession session{ uri.getHost(), uri.getPort() };
}
bool HTTP::doRequest(HTTPRequest& request, const string& path, const string& content, string& responseBody) {
...
session.setTimeout(Timespan(5, 0));
//std::ostream& requestStream = session->sendRequest(request);
std::ostream& requestStream = session.sendRequest(request);
...
}
如果我使用 unique_ptr 创建会话对象,就像在注释代码中一样,一切都很好。
但是如果我只使用简单的变量,就像在当前版本中一样。 然后行
session.sendRequest(请求)
抛出异常连接被拒绝
我不明白为什么? 你能解释一下吗?
P.S。 request 对静态资源的简单 HTTP GET 请求。
HTTP::HTTP(const string& adress)
{
Poco::URI uri(
adress.substr(0, 4) == "http" ? adress : "http://" + adress
);
HTTPClientSession session{ uri.getHost(), uri.getPort() };
}
此构造函数的最后一行创建了一个名为 session
的局部变量,...在构造函数 returns 时立即销毁,与 class 无关同一成员的成员。
因此,当一切都说完之后,这个 class 实例的 session
成员仍未初始化。出于比较目的:
session = HTTPClientSession{ uri.getHost(), uri.getPort() };
这将正确地初始化 class 成员,而不是像您明显的意图那样。但是,由于 HTTPClientSession 没有可用的赋值运算符,您唯一的选择是继续使用 unique_ptr
,或者重构构造函数,以便它在其初始化列表中构造 class 成员。