C ++几乎没有istream指针和refferecnes和重构

时间:2017-05-09 14:56:08

标签: c++ pointers refactoring poco istream

以下功能有效,但在我看来它的味道非常难闻。

我的项目通过HTTP与设备进行通信,它有一些带有摘要认证的URL,有些页面没有。 有些网址被压缩,有些没有压缩。 所以我的函数有三种不同的方式来获取istream。 我需要在函数底部的一个地方读取istream。 但正如我在另一个问题C++ variable visable scopes and strems中所说的好人一样,在这种情况下,指针很糟糕。

在这段代码中,在某些情况下会创建动态对象。

Poco::InflatingInputStream* inflater = new Poco::InflatingInputStream(*respStreamPtr);

这是内存泄漏的途径吗?

如果在没有语句的情况下创建inflater,则 * respStreamPtr 没有if块范围之外的数据。

所以,请告诉我如何以正确的方式重构此代码。

    std::ostream& requestStream = session->sendRequest(request);
    istream* respStreamPtr;
    respStreamPtr = &session->receiveResponse(response);
    if (response.getStatus() == HTTPResponse::HTTP_UNAUTHORIZED)
    {
        credentials->authenticate(request, response);
        session->sendRequest(request);
        respStreamPtr = &session->receiveResponse(response);
    }
    if (response.has("Content-Encoding") && response.get("Content-Encoding") == "deflate") {
        Poco::InflatingInputStream* inflater = new Poco::InflatingInputStream(*respStreamPtr);
        respStreamPtr = &std::istream(inflater->rdbuf());
    }
    std::ostringstream stringStream;
    stringStream << respStreamPtr->rdbuf();
    responseBody = stringStream.str();

1 个答案:

答案 0 :(得分:0)

是的,这将是内存泄漏,因为每次使用new时,它都会创建一个新对象,而您永远不会delete

但是,您在其声明的范围之外使用inflater变量,因此目前无法在不修改其他代码的情况下很好地删除它。要进行简单的修复,您只需在代码顶部声明Poco::InflatingInputStream* inflater = nullptr;,然后在结尾处将其删除。

我强烈建议您阅读如何在c ++中正确管理内存,甚至了解智能指针(但不能先了解基础知识)

Poco实际上具有完成你所做的很多功能的功能,所以你的例子很容易被压缩(免责声明:未经测试):

session->sendRequest(request);
auto& responseStream = session->receiveResponse(response);
if (response.getStatus() == HTTPResponse::HTTP_UNAUTHORIZED)
{
    credentials->authenticate(request, response);
    session->sendRequest(request);
    responseStream = session->receiveResponse(response);
}
if (response.has("Content-Encoding") && response.get("Content-Encoding") == "deflate") 
{
    Poco::InflatingInputStream inflater(responseStream);
    StreamCopier::copyStream(inflater, responseStream);
}
responseBody << responseStream;