我使用的是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();
没有任何改变,不会增加/减少或释放记忆。