Poco :: Net :: HTTPClientSession抛出异常而没有unique_ptr

时间:2019-03-03 16:50:49

标签: c++ c++11 poco-libraries

我有2个版本的代码:

    // 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。 请求是对静态资源的简单HTTP GET请求。

1 个答案:

答案 0 :(得分:1)

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,或重新构造构造函数,以便它在其初始值设定项列表中构造类成员。