以下功能有效,但在我看来它的味道非常难闻。
我的项目通过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();
答案 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;