【问题标题】:C++ variable visable scopes and stremsC++ 变量可见范围和流
【发布时间】:2017-10-07 02:51:46
【问题描述】:

我是 C++ 新手,无法理解某些行为。 具有以下功能,在这种情况下它可以工作。

bool Network::doRequest(HTTPRequest& request, string path, string content) {
  HTTPResponse response;
  istream* respStreamPtr;
  session->sendRequest(request);
  respStreamPtr = &session->receiveResponse(response);
  if (response.getStatus() == HTTPResponse::HTTP_UNAUTHORIZED)
  {
    credentials->authenticate(request, response);
    session->sendRequest(request);
    respStreamPtr = &session->receiveResponse(response);
  }
  if (response.get("Content-Encoding") == "deflate") {
    Poco::InflatingInputStream inflater(*respStreamPtr);
    respStreamPtr = &std::istream(inflater.rdbuf());
    Logger::dumpStream(*respStreamPtr);
  }
  return true;
}

但如果将字符串 Logger::dumpStream(*respStreamPtr); 移出 if 块。像这样:

  if (response.get("Content-Encoding") == "deflate") {
    Poco::InflatingInputStream inflater(*respStreamPtr);
    respStreamPtr = &std::istream(inflater.rdbuf());
  }
  Logger::dumpStream(*respStreamPtr);

停止工作!!! 条件 (response.get("Content-Encoding") == "deflate") 始终为真; 因此,块中的可见性流内容很麻烦。 但我无法理解我做错了什么。 请帮帮我。

附:这两种情况都不例外。在第二种情况下,文件 somefile.txt 中没有数据。 在第一种情况下,文件 somefile.txt 中包含来自 http 请求的数据。

void Logger::dumpStream(std::istream& inputStream) {  
  fstream outStream("somefile.txt", ios_base::trunc | ios_base::out | ios_base::binary);
  outStream << inputStream.rdbuf();
  outStream.close();
}

【问题讨论】:

    标签: c++ pointers inputstream poco-libraries


    【解决方案1】:

    我不熟悉您使用的类,但问题似乎很可能是 Poco::InflatingInputStream inflater 超出范围。

    if 语句内部:

    if (response.get("Content-Encoding") == "deflate") {
       Poco::InflatingInputStream inflater(*respStreamPtr);
       respStreamPtr = &std::istream(inflater.rdbuf());
    } 
    

    respStreamPtr 指向一个流,该流使用来自您的inflater 对象的缓冲区。一旦 if 语句关闭,该缓冲区就不再有效,因此您不能在外面使用 respStreamPtr

    【讨论】:

    • 指针本身变得悬空,实际上是立即。除了 VS 之外的任何其他编译器都会禁止这种非标准代码。不要拿临时工的地址。
    • 感谢您这么快的回复。请在主要问题中更新。添加了新语句 inflater = new。现在它可以工作了。但是现在我有内存泄漏,因为我没有删除 inflate 对象?
    • @greenif 请不要编辑问题。问题得到了回答。如果您还有其他问题,请发新帖。
    猜你喜欢
    • 2014-04-05
    • 1970-01-01
    • 2018-11-14
    • 1970-01-01
    • 2014-06-09
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多