首页 > 编程语言 >【Qt】记录WA_DeleteOnClose释放栈空间导致的程序异常崩溃问题

【Qt】记录WA_DeleteOnClose释放栈空间导致的程序异常崩溃问题

时间:2023-01-12 11:57:15浏览次数:47  
标签:Qt WA DeleteOnClose argv QWidget include

背景

项目中,有个需求是,父窗口关闭窗口时,子窗口也要同时关闭。

我们通过设置属性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模式下运行,当关闭窗口时,会弹框报错如下:

image-20230112110808465

问题排查

1、排查报错位置

由于这块代码,最近没有大改动,改动的地方很少。所以一个一个的代码还原之后,确定是哪行或者哪个函数导致的。

最终将 w.setAttribute(Qt::WA_DeleteOnClose);这句话注释掉之后,没有报错了。看来问题出在这个Qt::WA_DeleteOnClose上了。

2、确认原因

通过F1查询此枚举类型·具体含义

image-20230112111843624

好吧,看到这里,我大概明白了,这个会调用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

相关文章