问题:
while(1){
QNetworkAccessManager *aa = new QNetworkAccessManager();
QNetworkReply *bb;
QNetworkRequest Request;
Request.setUrl(QUrl(“http://127.0.0.1“));
bb= aa->get(Request);
bb->abort();
bb->close();
bb->deleteLater();
bb = NULL;
delete aa;
aa = NULL;
}
while(1){
QNetworkAccessManager *aa = new QNetworkAccessManager();
QNetworkReply *bb;
QNetworkRequest Request;
Request.setUrl(QUrl(“http://127.0.0.1“));
bb= aa->get(Request);
bb->abort();
bb->close();
bb->deleteLater();
bb = NULL;
delete aa;
aa = NULL;
}
我在做了个蜘蛛,用QNetworkAccessManager 取网页代码,很久才能看到问题,上面代码运行就能看到问题
一般情况下没人会发现,win7下用windows任务管理器,选项-选择列-选中句柄数,
内存确实增加不多,始终保持在30M左右
这句柄数一直上升,我服务器上大概句柄数跑到200万时候就崩溃,上面这段代码,几分钟就能跑到上百万的句柄数,
而且可以看出,new 了都有delete的
这是什么问题,QNetworkAccessManager 本身代码问题还是没有做什么设置才会这样
解答:
你的代码是没有问题的,QT的库也是没有问题的,只是用法上需要完善,在while循环中的aa = NULL;后面加上一句a.processEvents()(a就是QApplication实例对象);处理所有事件即可解决泄露的问题。
有些资源是到event循环中才会被真正释放。
引用一段文档
void QObject::deleteLater () [slot]
Schedules this object for deletion.
The object will be deleted when control returns to the event loop. If the event loop is not running when this function is called (e.g. deleteLater() is called on an object before QCoreApplication::exec()), the object will be deleted once the event loop is started.