簡體   English   中英

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(請求)

拋出異常連接被拒絕

我不理解為什么? 你能解釋我嗎?

PS請求是對靜態資源的簡單 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 ,或者重構構造函數,以便它在其初始值設定項列表中構造類成員。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM