2017-05-08 3 views
0

私はC++の初心者で、何らかの動作を理解できません。 以下の機能があり、この場合は機能します。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; 
} 

しかし、もし移動列ロガー:: 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")は常にtrueです。 ブロック内の可視性ストリームのコンテンツに問題があります。 しかし私は何が間違っているのか理解できません。 お願いします。

P.S.どちらの場合も例外はありません。 2番目のケースでは、ファイル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(); 
} 

答えて

3

私はあなたが使用しているクラスに慣れていないんだけど、スコープの外に起こっている問題がPoco::InflatingInputStream inflaterである可能性が非常に高いと思われます。 if文の内側

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

respStreamPtrはあなたinflaterオブジェクトからのバッファを使用してストリームに向けられています。 if文が終了すると、そのバッファはもはや有効ではなく、したがって、あなたはrespStreamPtrを外部に使用することはできません。

+2

ポインタそのものがぶら下がり、実際は_immediately_になります。 VS以外のコンパイラは、この非標準コードを禁止します。一時的な人の住所を取ってはいけません。 –

+0

すみません、ありがとうございます。 質問をメインの質問で更新してください。 新しいステートメントinflater = newが追加されました。 これで動作します。 しかし、今私はメモリリークを持っている、私はオブジェクトを膨らませて削除しないでください? – greenif

+2

@greenif質問を編集しないでください。質問に答えました。ご質問がありましたら、新しい投稿をしてください。 –