博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Qt程序继承QApplication发生崩溃的原因
阅读量:5137 次
发布时间:2019-06-13

本文共 1288 字,大约阅读时间需要 4 分钟。

一、前情介绍

     QApplication是Qt开发中经常用到的一个类,用来管理应用程序的生命周期。跟其相关的类还有QCoreApplication和QGuiApplication,分别用于不同场景下为应用程序的控制流和事件处理提供基础的框架。这三个类的构造函数都接收两个参数(分别是argc和argv),和C/C++程序的main函数的参数差不多。因此,大部分情况下我们是直接将main函数的这两个参数传给QApplication(这里以GUI程序为例):

1 #include 
2 3 int main(int argc, char *argv[])4 { 5 QApplication app( argc, argv );6 // Create main window...7 8 return app.exec();9 }

    绝大部分情况下这不会有什么问题,程序能够正常运行并结束。但是最近遇到的一个Qt程序崩溃的问题,却不得不让我对QApplication的两个参数提高了警惕。情况是这样的,我们在项目中为了保存一些全局性的数据,从QApplication派生了一个子类,并增加了一些新的方法来保存运行时的数据。编译运行很开心,程序完全满足了我们的要求。但是程序发布出去给用户使用的时候,我们在后台的崩溃上报系统中看到了一个这样的崩溃堆栈:

    很明显程序在QCoreApplication的arguments()方法中崩溃了。这个崩溃堆栈让我们不由得浮想联翩:难道这个是Qt框架本身的Bug?不小心被我给踩到了?因为我们的程序运行起来之后,没有什么地方会和QCoreApplication的arguments方法打交道啊!这么一想心里顿时好受多了,帅锅技能升华!

     过了一段时间之后,另外一个同事想在mac电脑上来编译工程,却发现编译后的程序死都运行不起来。一运行就报错:EXC_i386_GPFLT QCoreApplication::arguments,又将矛头指向了QCoreApplication的arguments方法,这下我慌了!这下必须要仔细排查下原因,不能假装不知道继续帅锅了!根据关键字EXC_i386_GFLT没用找到什么有用的东西,再一搜Qt QApplication arguments方法崩溃,就找到了一堆的信息,其中Qt bug管理系统上的一个用户吐槽最为详细:

    这个用户说的很详细,QApplication的构造函数中argc必须为引用传值方式,否则程序会崩溃!然而Qt官方文档并没有强调这一点,导致很多用户根本没在意到这一点。再去看Qt文档,可以发现QApplication,QCoreApplication和QGuiApplication的构造函数中,argc都是引用传值的方式声明的。确实粗心大意了!

    

二、参考链接

1.

2.

3.

4.

转载于:https://www.cnblogs.com/csuftzzk/p/qapplication_arguments_crash.html

你可能感兴趣的文章
utc本地时间
查看>>
面试官问我,Redis分布式锁如何续期?懵了
查看>>
Java大坑之Integer对象比较相等
查看>>
syzkaller安装
查看>>
python_基于反射模拟Web框架路由系统
查看>>
python 线程池的使用
查看>>
以多进程读取oss符合条件的数据为例,综合使用多进程间的通信、获取多进程的数据...
查看>>
WPF自定义控件(三)——Window
查看>>
golang Time to String
查看>>
什么是分布式系统
查看>>
Java面向对象编程(二)
查看>>
mac配置vim-go
查看>>
12.17模拟赛
查看>>
守形数
查看>>
【Java基础总结】字符串
查看>>
NET项目中分页方法
查看>>
a different object with the same identifier,同一个session中存在不同的对象问题
查看>>
HDU 6153 A Secret(扩展kmp)
查看>>
仅在ACCESS窗体设计中,实现数据文件连接的方法
查看>>
深夜敲模板_3——树的点分治(poj1741解题报告)
查看>>