Qt::WA_DeleteOnClose 造成的野指针问题
2016-09-08 11:17
267 查看
今天遇到了一个由Qt::WA_DeleteOnClose造成的野指针问题,在网上搜到的一个求助贴如下(http://bbs.csdn.net/topics/380182058):
主窗口类QMainWindow的头文件里定义了一个QDialog类的指针:QDialog *dialog;
现有如下函数语句:
当我第一次在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
主窗口类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::WA_DeleteOnClose 造成的野指针问题
- Qt::WA_DeleteOnClose造成的野指针问题
- Qt的模态对话框和非模态对话框 经常使用setAttribute (Qt::WA_DeleteOnClose)
- Qt 窗体的模态与非模态(setWindowFlags(Qt::WindowStaysOnTopHint);比较有用,还有Qt::WA_DeleteOnClose)
- QT setAttribute(Qt::WA_DeleteOnClose)
- QWidget 的 close 与 Qt::WA_DeleteOnClose
- Qt对话框/窗口、模态和非模态、Qt::WA_DeleteOnClose
- Qt 程序退出时断言错误——_BLOCK_TYPE_IS_VALID(pHead->nBlockUse),由setAttribute(Qt::WA_DeleteOnClose)引起
- Qt 框架_setAttribute(Qt::WA_DeleteOnClose)使用注意
- Qt 窗口属性简介之Qt::WA_DeleteOnClose
- [C/C++][经典探讨]类继承中,通过基类指针delete释放,是否会造成内存泄漏 http://blog.csdn.net/code_godfather/article/details/66480
- C++ delete指针依然可访问问题
- 类继承中,通过基类指针delete释放,是否会造成内存泄漏
- 容器存放指针造成的内存泄露问题
- QT信号槽的六个优点(虽然直接调用函数也可解决问题,但要在具体的函数中传递指针,多对一和解除关系也够麻烦的)
- Qt中delete的问题
- delete指针以后应赋值为NULL——QT deletelater指针以后也同样要马上赋值为NULL
- Qt版本差异造成的问题与解决方法
- c++中由于delete造成的悬垂指针