qt 的QNetworkAccessManager的使用和防止内存泄漏

原创 2015年07月07日 10:40:08

今天项目中用到了http协议,大致看了一下QNetworkAccessManager这个类,发现通过这个类调用了get或者post请求后获取结果居然是通过信号和槽来实现的,结果返回是通过void finished(QNetworkReply * reply)这个信号传出来的,那么问题来了,由于不知道请求的结果什么时候下载完,既不知道这个finished信号什么时候抛出,那么也不知道这个QNetworkAccessManager对象该在什么时候delete。

这个可不好办呐,不delete的话就会内存泄漏,对于程序员来说这是很恐怖的事~

我觉得qt应该也不会让这种bug出现吧,果不其然,在文档对finished信号的描述中有这么一句话:

”Note: Do not delete the reply object in the slot connected to this signal. Use deleteLater().“

意思就是如果连接了该信号,就不要delete这个对象,用deleteLater()这个函数。

deleteLater(),顾名思义就是延迟delete的作用,我随后认真看了一下deleteLater的文档和上网搜寻了一下相关的资料,发现实际上deleteLater也不是想象中那么靠谱。。

void QObject::deleteLater()
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. If deleteLater() is called after the main event loop has stopped, the object will not be deleted. Since Qt 4.8, if deleteLater() is called on an object that lives in a thread with no running event loop, the object will be destroyed when the thread finishes.


Note that entering and leaving a new event loop (e.g., by opening a modal dialog) will not perform the deferred deletion; for the object to be deleted, the control must return to the event loop from which deleteLater() was called.


Note: It is safe to call this function more than once; when the first deferred deletion event is delivered, any pending events for the object are removed from the event queue.


从文档中可以看出,调用deleteLater的对象将在程序控制返回事件循环后被delete,也就是控制权回到QApplication时才删除

相关文章推荐

Qt网络开发之QNetworkAccessManager使用要点

要点一:对于一个应用程序,一个QNetworkAccessManager就足够了,当然使用多个QNetworkAccessManager也是没有问题的,Webkit中一个QWebpage只会使用一个Q...

程序员一枚】Qt网络开发之QNetworkAccessManager的使用

最近使用Qt实现一个C/S的应用,结构比较有意思,相信很多人做过C/S的应用,也已经有很多成熟的架构。但是我这个东西还是不一样的。     我们公司有成熟的服务器产品,基于B/S的,SOA结构,...

Qt模拟Http Post上传文件行为—内存释放问题

最近在做一个小项目,需要向一个服务器批量上传本地文件,通过表单数据formData格式提交给服务器,于是需要用Qt模拟这一行为。关于Qt模拟Http Post行为的博文很多,可以参考博文:http...

Qt网络编程之QNetworkReply

Qt网络编程之QNetworkReply 分类: Qt2012-03-25 11:52 1737人阅读 评论(0) 收藏 举报                           ...

QNetworkAccessManager不使用信号/槽机制来获得QNetworkReply的解决办法

正在做一个第三方微信企业要接口的项目,JAVA的实现方法比较简单,网上资料也很多。 但是我需要在C++下实现,微信企业号接口大多都是https的GET/POST方法实现的。 Qt提供了一个封装好的类Q...

解决QNetworkAccessManager实现ftp功能后,不能上传大于1G文件的问题

最近做一个ftp上传工具,用的是QNetworkAccessManager实现ftp工具,网上很多demo 实现ftp上传,但是有一个很严重的问题,当上传的文件足够大,比如大于1G那么上传就不起作用了...

QWebView 释放问题-Qt5.4.2版本

QWebView 的释放,官网说的也不是很清楚,个人测试所得结果为:当要释放QWebView对象时,需要首先调用其stop()函数,然后调用close(),最后在调用deleteLater(),才能完...

Qt内存泄漏问题

转自: 今天对于自己写的Qt程序在内存泄漏上起了很大怀疑,怀疑自己的程序中很多地方存在泄漏。然后就找了一下资料,自己写了个小程序和大家分享一下。 首先我们知道Qt有一套回收内存...

Qt网络编程之QNetworkReply

Qt网络编程之QNetworkReply 注意:这个类中的所有函数都是可重入的。 这个类是从Qt4.4引入的。 详细描述:         QNetworkReply 类包含了发送给Q...

Qt浅谈之一:内存泄露(总结)

Qt内存管理机制:Qt 在内部能够维护对象的层次结构。对于可视元素,这种层次结构就是子组件与父组件的关系;对于非可视元素,则是一个对象与另一个对象的从属关系。在 Qt 中,在 Qt 中,删除父对象会将...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:qt 的QNetworkAccessManager的使用和防止内存泄漏
举报原因:
原因补充:

(最多只允许输入30个字)