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 5使用QNetworkAccessManager类遇到的问题

QT 5使用QNetworkAccessManager类来处理各种协议的请求,包括http协议,ftp协议等,通常和QUrl,QNetworkRequest配合使用。 一个典型的应用场景...
  • oMingZi12345678
  • oMingZi12345678
  • 2013年08月03日 00:41
  • 2727

Qt网络开发之QNetworkAccessManager使用要点

要点一:对于一个应用程序,一个QNetworkAccessManager就足够了,当然使用多个QNetworkAccessManager也是没有问题的,Webkit中一个QWebpage只会使用一个Q...
  • u010002704
  • u010002704
  • 2014年11月21日 18:55
  • 6301

Qt网络编程之QNetworkReply

Qt网络编程之QNetworkReply 注意:这个类中的所有函数都是可重入的。 这个类是从Qt4.4引入的。 详细描述:         QNetworkReply 类包含了发送给Q...
  • chenlong12580
  • chenlong12580
  • 2012年03月25日 19:52
  • 20347

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

Qt内存管理机制:Qt 在内部能够维护对象的层次结构。对于可视元素,这种层次结构就是子组件与父组件的关系;对于非可视元素,则是一个对象与另一个对象的从属关系。在 Qt 中,在 Qt 中,删除父对象会将...
  • taiyang1987912
  • taiyang1987912
  • 2014年06月12日 15:08
  • 13142

Qt5使用内存泄露检测工具—VLD

本文简要描述一下在Qt应用中使用VLD来检测内存泄露。本次测试环境所用的Qt版本是:qt-opensource-windows-x86-msvc2013_64-5.4.0 一、VLD工具...
  • q5707802
  • q5707802
  • 2015年04月21日 23:39
  • 7796

Qt中内存泄露和退出崩溃的问题

Qt中帮程序员做了一些内存回收的事情,但正因为这些反而让对此不熟悉的人会屡屡犯错。 收录一篇不错的文章: 在C++中学习过程中,我们都知道: delete 和 new 必须 配对使用(一 一...
  • wangkuiyun
  • wangkuiyun
  • 2012年03月30日 17:27
  • 15112

Qt浅谈之内存泄露

一、简介        Qt内存管理机制:Qt 在内部能够维护对象的层次结构。对于可视元素,这种层次结构就是子组件与父组件的关系;对于非可视元素,则是一个对象与另一个对象的从属关系。在 Qt 中...
  • tian_110
  • tian_110
  • 2015年01月04日 22:00
  • 573

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

 一、简介        Qt内存管理机制:Qt 在内部能够维护对象的层次结构。对于可视元素,这种层次结构就是子组件与父组件的关系;对于非可视元素,则是一个对象与另一个对象的从属关系。在 Qt...
  • zy_heu
  • zy_heu
  • 2016年12月16日 08:39
  • 734

Qt内存泄漏问题

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

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

今天项目中用到了http协议,大致看了一下QNetworkAccessManager这个类,发现通过这个类调用了get或者post请求后获取结果居然是通过信号和槽来实现的,结果返回是通过void f...
  • yangkping123
  • yangkping123
  • 2015年07月07日 10:40
  • 1322
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:qt 的QNetworkAccessManager的使用和防止内存泄漏
举报原因:
原因补充:

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