• 7232阅读
  • 5回复

QNetworkAccessManager明显的内存泄漏 [复制链接]

上一主题 下一主题
离线hitler++
 

只看楼主 倒序阅读 楼主  发表于: 2012-07-26
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任务管理器,选项-选择列-选中句柄数,
内存确实增加不多
这句柄数一直上升,我服务器上大概句柄数跑到200万时候就崩溃,上面这段代码,几分钟就能跑到上百万的句柄数,
而且可以看出,new 了都有delete的


这是什么问题,QNetworkAccessManager 本身代码问题还是没有做什么设置才会这样

离线wxj120bw

只看该作者 1楼 发表于: 2012-07-27
回 楼主(hitler++) 的帖子
将bb->deleteLater();改成delete bb;尝试下
离线hitler++

只看该作者 2楼 发表于: 2012-07-27
不行的
deleteLater 就相当于 delete bb;bb=NULL;了
离线amala

只看该作者 3楼 发表于: 2012-07-29
QNetworkAccessManager是异步的,你这样写没问题就真见鬼了
离线hitler++

只看该作者 4楼 发表于: 2012-08-06
引用第3楼amala于2012-07-29 22:41发表的  :
QNetworkAccessManager是异步的,你这样写没问题就真见鬼了

你要真知道答案就不会这样回答了
离线chen.kline

只看该作者 5楼 发表于: 2012-12-29
楼主这么写,确实有大问题的。
1. QNetworkAccessManager::get是异步的, 在这里不能删除bb,需要等到操作完成的通知到来后再删除

2. 原则上一个应用仅需要一个QNetworkAccessManager对象,你不应不断newQNetworkAccessManager对象,应当在应用启动时new aa,在应用关闭时delete aa
小小蝼蚁
http://weibo.com/chenkline
快速回复
限100 字节
 
上一个 下一个