QNetworkAccessManager不释放内存

时间:2014-06-16 06:21:20

标签: c++ qt memory qnetworkaccessmanager

我使用的是Qt 4.7。我的同步过程使用的是另一个线程。我们使用QNetworkAccessManager来应用于服务器以执行同步。我注意到QNetworkReply使用的所有内存从未发布。

在阅读了几个页面并进行了不同的测试之后,我明白它并不像有些人所说的那样是内存泄漏,而是它释放内存的问题。实际上它甚至可以接受使用这种内存,但显然,因为我在embbeded中工作,因为更多的内存更好(不仅仅用于embbeded)。

事情是每次我们同步(60秒)时内存不会增加,但在删除之后,它也不会释放它。

虽然它不是非常正统,我使用Top来检查内存使用情况。

我的代码:

Sync::Sync(const Settings &settings)
{

net_manager = new QNetworkAccessManager(this);
reply_ = 0;
}

从网址获取状态:

 void Sync::get_status()
{
QUrl url(status_url);

connect( net_manager, SIGNAL(finished(QNetworkReply*)),
        this, SLOT(reply_status(QNetworkReply*)) );

reply_ = net_manager->get(QNetworkRequest(url));

connect(reply_, SIGNAL(error(QNetworkReply::NetworkError)),
        this, SLOT(slDownloadFilesError(QNetworkReply::NetworkError)));

}

回复提示:

void Sync::reply_status(QNetworkReply* reply)
{

   if ( reply->error() != QNetworkReply::NoError ) {
       qDebug()<<"[Sync]" << "..........NETWORK ERROR: " << reply->error() << "\nERROR STRING: " <<reply->errorString();

       sl_freeMemory();
       return;
   }

sl_freeMemory();

//Do whatever...

}

最后一部分:

void Sync::sl_freeMemory()
{
if(reply_ == 0)
    return;

disconnect( net_manager, SIGNAL(finished(QNetworkReply*)),
        this, SLOT(reply_status(QNetworkReply*)) );

disconnect(reply_, SIGNAL(error(QNetworkReply::NetworkError)),
        this, SLOT(slDownloadFilesError(QNetworkReply::NetworkError)));

reply_->abort();
reply_->deleteLater();
reply_ = 0;


}

我真的很感激你能给我的任何暗示。我检查了几个网站,其逻辑与我使用的网站相同。

提前致谢!

编辑:根据@vahancho的建议,我做了以下修改。 每次我想要同步时,我都会用

创建网络管理器
net_manager = new QNetworkAccessManager(this); (Inside get_status()).

在sl_freeMemory()中添加了

net_manager->disconnect();
net_manager->deleteLater();

没有任何改变,不会增加/减少或释放记忆。

0 个答案:

没有答案