背景
项目中,有个需求是,父窗口关闭窗口时,子窗口也要同时关闭。
我们通过设置属性Qt::WA_DeleteOnClose
可以实现。
// 设置属性
QWidget* widget = new QWidget();
widget->setAttribute(Qt::WA_DeleteOnClose); // 设置属性,当关闭父窗口时,子窗口也关闭。
运行起来发现没有什么问题。
问题复现
一次偶然的机会,想要专门针对此模块进行测试处理时,main.cpp
中示例代码如下。
#include <QApplication>
#include <QWidget>
int main(int argc, char* argv[])
{
QApplication a(argc, argv);
QWidget w;
w.setAttribute(Qt::WA_DeleteOnClose);
w.show();
return a.exec();
}
在Debug
模式下运行,当关闭窗口时,会弹框报错如下:
问题排查
1、排查报错位置
由于这块代码,最近没有大改动,改动的地方很少。所以一个一个的代码还原之后,确定是哪行或者哪个函数导致的。
最终将 w.setAttribute(Qt::WA_DeleteOnClose);
这句话注释掉之后,没有报错了。看来问题出在这个Qt::WA_DeleteOnClose
上了。
2、确认原因
通过F1查询此枚举类型·具体含义
好吧,看到这里,我大概明白了,这个会调用delete
进行资源释放,但是delete的地址是栈上空间地址,所以报这个错误。
问题处理
既然是delete了栈上空间,则将QWidget实例创建到堆上,可以避免此问题。
#include <QApplication>
#include <QWidget>
int main(int argc, char* argv[])
{
QApplication a(argc, argv);
QWidget *w = new QWidget();
w->setAttribute(Qt::WA_DeleteOnClose);
w->show();
return a.exec();
}
标签:Qt,WA,DeleteOnClose,argv,QWidget,include
From: https://www.cnblogs.com/ganshang/p/17045850.html