【问题标题】:Poco::Net::HTTPClientSession throw exception without unique_ptrPoco::Net::HTTPClientSession 在没有 unique_ptr 的情况下抛出异常
【发布时间】:2019-03-03 16:50:48
【问题描述】:

我有两个版本的代码:

    // 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(request)

抛出异常连接被拒绝

我不明白为什么? 请您解释一下。

附: request 是对静态资源的简单 HTTP GET 请求。

【问题讨论】:

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


    【解决方案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,或者重新构造构造函数,以便在其初始化列表中构造类成员。

    【讨论】:

    • 我理解了主要思想,在我的代码中“会话”是本地变量,而不是类成员。但是当我尝试像你写的那样初始化会话时,我得到了错误:错误 C2248 'Poco::Net::HTTPClientSession::operator =': cannot access private member declared in class 'Poco::Net::HTTPClientSession'
    • 那么这意味着这个库不支持这个功能,你必须始终使用唯一的ptr。我会更新我的答案。
    猜你喜欢
    • 2015-07-11
    • 1970-01-01
    • 2015-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-23
    • 2016-07-16
    相关资源
    最近更新 更多