Qt::WA_DeleteOnClose 造成的野指针问题
2016-02-26 12:28
288 查看
今天遇到了一个由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,会变为野指针。
现有如下函数语句:
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,会变为野指针。
相关文章推荐
- Qt5中用QLCDNumber显示时间
- QT 为按钮添加事件
- QT SSL OpenSSL https
- Qt 5.4错误"qt.network.ssl: QSslSocket: cannot call"
- 使用QTextCodec/QString/QByteArray/std::string时中文编码问题
- 使用QTextCodec/QString/QByteArray/std::string时中文编码问题
- Qt tip——初始化窗体Geometry()
- Qt查找子窗口
- Qt获取控件位置,坐标总结
- Qt::FocusPolicy的使用
- Qt中的焦点事件
- Qt键盘事件
- 今天开始学习QT for sysbiam 1
- Qt贪吃蛇(代码裸写,不用creator)
- qt中int与string的相互转换
- QT离线安装包下载地址
- QT 按键
- windows下 QT5编译手记
- 安卓开发资源下载(NDK/QT/SDK)
- 【转】Qt Socket简单通信