2017-05-08 65 views
0

我是C++新手,無法理解一些行爲。 有以下功能,在這種情況下,它的工作原理。C++可變可視範圍和strems

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; 
} 

但如果搬移字串記錄儀::轉存(* 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」)始終爲真; 因此,塊中可見性流內容的麻煩。 但我不明白我做錯了什麼。 請幫助我。

P.S.在這兩種情況下都不例外。在第二種情況下,文件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請不要編輯問題。這個問題得到了回答。如果您還有其他問題,請發一個新帖子。 –