QWidget析构函数存在的缺陷
2013-11-19 17:47
274 查看
这个问题是在上一篇处理程序无响应的时候发现的,背景就不说了。在处理完跨线程操作对象的问题后,发现仍然有小概率出现无响应现象,经过检测,和处理之前一样的现象,QPointer中保存的QObject(准确的说是保存的QWidget)对象指针存在,他的d_ptr却变成了NULL,也就是说变成了野指针。
在QPointer开始保存对象的时候添加检测,发现在出现野指针之前有下面的堆栈:
从这里可以看到,在QWidget的析构函数里面调用了 DestroyWindow函数,该函数的他会清空线程的消息队列,所以调用到了WndProc。 如果消息队列中存在一个消息,在这个消息处理中使用了QPointer来保存QWidget会不会存在问题呢?分析一下,有两种情况:
1.保存的对象在本次析构完成前使用:此时的QWidget对象还没有销毁,所以使用中是不应该出现问题的。
2.保存的对象在析构以后调用:此时QWidget的基类QObject还没有开始析构,在QWidget析构完成时,QObject开始析构,他会标记QPointer中的对象为空,也不应该存在问题。
问题确实存在,继续查看代码实现:
这里有个判断widget,看来clearGuards在QWidget中有单独处理,查看QWidget的代码,确实在DestroyWindow之前就做了clearGuards,在这里说一下clearGuards的作用:在QPointer保存了一个QObject的指针,并把这个指针的指针交给全局变量GuardHash管理,而QObject 在销毁时会调用clearGuards函数来把全局 GuardHash 的那个指针置为零,因此所有QPointer中保存的这个指针都为空。在这里先调用了clearGuards,然后在DestroyWindow中消息循环时再去保存的QPointer,在DestroyWindow执行完,QObject析构的时候就不会再去理会GuardHash的问题,此时导致存在QPointer中的对象变成了野指针。
到这里问题比较明了了,在QWidget::~QWidget()析构时处理的消息,为了保证窗口的安全操作,提前clearGuards,如果存在QPointer保存控件对象的操作,都有可能导致QPointer中野指针的出现。
在QPointer开始保存对象的时候添加检测,发现在出现野指针之前有下面的堆栈:
从这里可以看到,在QWidget的析构函数里面调用了 DestroyWindow函数,该函数的他会清空线程的消息队列,所以调用到了WndProc。 如果消息队列中存在一个消息,在这个消息处理中使用了QPointer来保存QWidget会不会存在问题呢?分析一下,有两种情况:
1.保存的对象在本次析构完成前使用:此时的QWidget对象还没有销毁,所以使用中是不应该出现问题的。
2.保存的对象在析构以后调用:此时QWidget的基类QObject还没有开始析构,在QWidget析构完成时,QObject开始析构,他会标记QPointer中的对象为空,也不应该存在问题。
问题确实存在,继续查看代码实现:
这里有个判断widget,看来clearGuards在QWidget中有单独处理,查看QWidget的代码,确实在DestroyWindow之前就做了clearGuards,在这里说一下clearGuards的作用:在QPointer保存了一个QObject的指针,并把这个指针的指针交给全局变量GuardHash管理,而QObject 在销毁时会调用clearGuards函数来把全局 GuardHash 的那个指针置为零,因此所有QPointer中保存的这个指针都为空。在这里先调用了clearGuards,然后在DestroyWindow中消息循环时再去保存的QPointer,在DestroyWindow执行完,QObject析构的时候就不会再去理会GuardHash的问题,此时导致存在QPointer中的对象变成了野指针。
到这里问题比较明了了,在QWidget::~QWidget()析构时处理的消息,为了保证窗口的安全操作,提前clearGuards,如果存在QPointer保存控件对象的操作,都有可能导致QPointer中野指针的出现。
相关文章推荐
- ZYNQ 的PS GEM DMA存在缺陷
- 一、 找出函数中存在的问题。以下题目均在Lab05项目中完成。2、 找出项目中存在的缺陷,并给出解决的方案(至少3个,不包含下面那个举例)。 说明:这里所说的缺陷不一定都是错误,而是明显需要改进的地方。 如:不可以无限输入密码,容易被暴力破解,存在安全隐患。
- 纯技术角度分析目前二代身份证存在的安全缺陷及解决方案
- Macromedia JRun存在缓冲区溢出缺陷
- 被广泛使用的MD5.asp中似乎存在缺陷
- 【Win7下的虚拟XP模式存在六大缺陷】
- Adobe两款软件存在缺陷 黑客可控制用户PC
- 弱类型语言 Hash比较存在缺陷
- note:SMO算法存在致命缺陷
- [典型漏洞分享]YS的防暴力破解设计存在缺陷
- Web 2.0应用存在缺陷 Javascript导致泄密
- 中国脑计划颠覆性创新之路二,欧美脑计划存在重大缺陷
- 网络拥塞控制---传统TCP存在的缺陷
- Android存在安全缺陷:可被黑客窃听和监视
- 梦芭莎IOS客户端存在设计缺陷可重置任意用户密码
- 防火墙普遍存在的设计缺陷--关于进程路径的获取
- P2P网贷第三方托管模式存在5大缺陷,护法是最大的赢家
- 为什么丰田的软件存在缺陷?(转)
- jquery下载地址:https://code.jquery.com/jquery/ 影响范围: 版本低于1.7的jQuery过滤用户输入数据所使用的正则表达式存在缺陷,可能导致LOCA
- Skype软件存在2缺陷 用户PC可被***霸占