文章标题

问题:
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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值