gpt4 book ai didi

c++ - 没有 unique_ptr 的 Poco::Net::HTTPClientSession 抛出异常

转载 作者:行者123 更新时间:2023-11-30 04:50:26 25 4
gpt4 key购买 nike

我有两个版本的代码:

    // 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 对象,就像在注释代码中一样,一切都很好。

但是如果我只使用简单的变量,就像在当前版本中一样。然后行

session.sendRequest(请求)

抛出异常连接被拒绝

我不明白为什么?你能解释一下吗?

附言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 的局部变量,......当构造函数返回时它会立即被销毁,并且与同一成员的类成员无关。

所以,当一切都说完之后,这个类实例的 session 成员保持未初始化状态。出于比较目的:

session = HTTPClientSession{ uri.getHost(), uri.getPort() };

这将正确地初始化类成员,而不是像您明显的意图那样。但是,由于 HTTPClientSession 没有可用的赋值运算符,您唯一的选择是继续使用 unique_ptr,或者重构构造函数,以便它在其初始化列表中构造类成员。

关于c++ - 没有 unique_ptr 的 Poco::Net::HTTPClientSession 抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54971257/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com