Qt::WA_DeleteOnClose 造成的野指针问题
今天遇到了一个由Qt::WA_DeleteOnClose造成的野指针问题,在网上搜到的一个求助贴如下(http://bbs.csdn.net/topics/380182058):
主窗口类QMainWindow的头文件里定义了一个QDialog类的指针:QDialog *dialog;
现有如下函数语句:
if(dialog==null)
{
dialog=new Dialog(this);
dialog->setAttribute(QT::WA_DeleteOnClose,true);
}
dialog.show();
当我第一次在MainWindow里打开关闭dialog都正常,当我第二次再执行打开操作时候,就产生了内存读取冲突的错误,MainWindow也自动关闭了,求解,原因和方案,谢谢,本人新手
问题的原因是这样:
dialog->setAttribute(QT::WA_DeleteOnClose,true); //这里被delete之后并没有置NULL,第二次进来直接show就可能出问题了
发现我们的代码查出的问题是一样的,只不过dialog.show()写在另外一个子函数,也就是说指针在一个地方被delete释放了(它所指向的内存空间可以被其他程序申请使用了),没有置为NULL,在另一个地方检查非空后继续调用,这个指针此时虽然不为空,但是它指向的空间可能被别的程序申请去了,意义已经改变。
总结:
使用setAttribute( Qt::WA_DeleteOnClose, true );需要保证在关闭以后不在使用这个指针,因为这个指针是没有办法自动设为NULL,会变为野指针。
转自:http://blog.csdn.net/zzwdkxx/article/details/50748429
Qt::WA_DeleteOnClose 造成的野指针问题的更多相关文章
- QT构建窗体(父窗体传为野指针)异常案例
[1]源码 工作中,时常会遇到各种各样的异常场景,有些异常场景很常见,必要备录,以防再犯. 分享本案例为:QT创建窗体时parent父窗体传野指针引起异常. 本案例源码如下: 1.1 默认新建一个QT ...
- QT信号槽 中的对象野指针
例: connect(&objec1,&class::slot_func1,&object2,&class::slot_func2) 如果 &objec 传 ...
- Qt浅谈之一:内存泄露(总结),对于QWidget可以setAttribute(Qt::WA_DeleteOnClose),而且绝对不能手动删除栈上的对象
一.简介 Qt内存管理机制:Qt 在内部能够维护对象的层次结构.对于可视元素,这种层次结构就是子组件与父组件的关系:对于非可视元素,则是一个对象与另一个对象的从属关系.在 Qt 中,在 Qt 中,删除 ...
- Qt 程序退出时断言错误——_BLOCK_TYPE_IS_VALID(pHead->nBlockUse),由setAttribute(Qt::WA_DeleteOnClose)引起
最近在学习QT,自己仿写了一个简单的QT绘图程序,但是在退出时总是报错,断言错误: 报错主要问题在_BLOCK_TYPE_IS_VALID(pHead->nBlockUse),是在关闭窗口时报的 ...
- QPointer很大程度上避免了野指针(使用if语句判断即可,类似于dynamic_cast),而且使用非常方便 good
QPointer 如何翻译呢?我不太清楚,保留英文吧. The QPointer class is a template class that provides guarded pointers ...
- linux kernel elv_queue_empty野指针访问内核故障定位与解决
1. 故障描述 故障操作步骤: 单板上插了一个U盘,出问题前正在通过FTP往单板上拷贝文件,拷贝的过程中单板自动重启. 故障现象: Entering kdb (current=0xc000000594 ...
- iOS为真机调试增加scribble来定位野指针
尽管在ARC中,野指针出现的频率已经大大降低了,但是仍然会有野指针困扰着我们. 在模拟器调试中,我们可以开启scribble或者zombieObject来将已经释放的内存填充无意义的内容,能够将一些非 ...
- C++内存泄露之野指针
写出本文仅仅是处于备忘的目的. 最近为现在做的软件添加了一个内存回收机制(以前处于某种内存只申请不释放,这并不等于内存泄露,因为我们知道这些内存块在内存中的位置)-- 在某一块内存不使用的时候将其释放 ...
- iOS开发_内存泄漏、内存溢出和野指针之间的区别
今天,在工作群中,被问到了内存泄漏和野指针指向的区别,自己答的不是很好,特意回来查了资料,在博文中总结一下经验,欢迎指正. 内存泄漏:是指在堆区,alloc 或new 创建了一个对象,但是并没有放到自 ...
随机推荐
- android studio 中出现"...ProjectScript\buildscript\cache.properties.lock"
Owner PID: unknownOur PID: 8496Owner Operation: unknownOur operation: Initialize cacheLock file: C ...
- Python splitlines()方法
描述 Python splitlines() 按照行界符('\r', '\r\n', \n'等)分隔,返回一个包含各行作为元素的列表,默认不包含行界符. 能被识别的行界符: 行界符 描述 \n Lin ...
- Spring Data JPA使用Sort进行排序(Using Sort)(转)
通过上一节的学习,我们知道了如何用@Query注解来实现灵活的查询.在上一节的示例中,我也尝试给出简单的排序,通过JPQL语句以及原生SQL来实现的.这样的实现,虽然在一定程度上可以应用,但是灵活度不 ...
- python中杂乱问题
1 字符串格式化中的格式指定 format_spec ::= [[fill]align][sign][#][][width][,][.precision][type] fill ::= <any ...
- Spring依赖注入构造器注入(通过构造函数注入)
在src目录下建立applicationContext.xml (Spring 管理 bean的配置文件) <?xml version="1.0" encoding=&q ...
- 清除sqlserver日志方法(不适合always on)
清除sqlserver日志方法 --查看数据库的recovery_model_desc类型 SELECT NAME, recovery_model_desc FROM sys.databases -- ...
- Android开发3——查看和输出日志信息
一.错误级别 Error > Warn > Info > Debug > Verbose(冗余) 二.Android项目日志查看视图 Console视图只能看项目的部署到模拟器 ...
- Spring里的FactoryBean和BeanFactory有啥区别?
分别看这俩文章就知道了 Spring的FactoryBean使用 Spring加载xml配置文件的方式 ApplicationContext
- C++防止头文件反复包括
两种方法: (1)#pragma once. (2)ifndef/define/endif 差别: (1)#pragma once是编译器相关的.有的编译器支持,有的编译器不支持: (2)#ifnde ...
- Clojure 的 Enlive 库尝试
Enlive 是一个 Clojure 下的 html 模板引擎.其特别之处在于,它既没有发明任何 html 内嵌的模板 DSL 语法:也不会混杂代码和表现. 一切的一切,都是按下列模型定义的次序执行的 ...