Qt程序继承QApplication发生崩溃的原因
一、前情介绍
QApplication是Qt开发中经常用到的一个类,用来管理应用程序的生命周期。跟其相关的类还有QCoreApplication和QGuiApplication,分别用于不同场景下为应用程序的控制流和事件处理提供基础的框架。这三个类的构造函数都接收两个参数(分别是argc和argv),和C/C++程序的main函数的参数差不多。因此,大部分情况下我们是直接将main函数的这两个参数传给QApplication(这里以GUI程序为例):
#include <QApplication> int main(int argc, char *argv[])
{
QApplication app( argc, argv );
// Create main window... return app.exec();
}
绝大部分情况下这不会有什么问题,程序能够正常运行并结束。但是最近遇到的一个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. https://bugreports.qt.io/browse/QTBUG-5637
2. https://groups.google.com/forum/#!msg/mathgl/CVvVyRnl3X4/EPiRrnqy3moJ
4. https://stackoverflow.com/questions/35566459/segfault-when-accessing-qapplicationarguments
Qt程序继承QApplication发生崩溃的原因的更多相关文章
- [CareerCup] 12.2 Find the Reason of Crash 找到程序崩溃的原因
12.2 You are given the source to an application which crashes when it is run. After running it ten t ...
- 解决Qt程序发布时中文乱码问题(通过QApplication.addLibraryPath加载QTextCodec插件)
Qt程序的文字编码,是通过插件来解决的,所以我们发布的时候需要把相应的插件也发布出去,在开发者电脑上程序会自动从插件目录加载到插件,但是如果发布给别的电脑使用,需要手动指定插件路径,如下所示: int ...
- Ubuntu16.04下写的Qt程序,调试时没问题,运行时偶现崩溃 (需要在运行时生成core dump文件,QMAKE_CC += -g)
记录一下 Ubuntu16.04下写的Qt程序,调试时没问题,运行时偶现崩溃 需要在运行时生成core dump文件 首先在pro结尾里加入 QMAKE_CC += -g QMAKE_CXX += - ...
- Qt程序Release版出现 类似 QEventLoop: Cannot be used without QApplication 问题的终极解决方案
最近在做Qt程序开发,程序在Debug下跑是没有问题的,发布到Release版本后,出现各种问题: 报各种莫名其妙的错误,类似的错误有: QEventLoop:Cannot be used wit ...
- (转) Qt 出现“undefined reference to `vtable for”原因总结
由于Qt本身实现的机制所限,我们在使用Qt制作某些软件程序的时候,会遇到各种各样这样那样的问题,而且很多是很难,或者根本找不到原因的,即使解决了问题,如果有人问你为什么,你只能回答--不知道. 今天我 ...
- 1.第一个QT程序
第一个QT程序 应用程序类QApplication 窗口类MyWidget 进入事件循环 a.exec() 头文件 mywidget.h QApplication 文件Demo_pro 我怎么知道我用 ...
- VS2010 win7 QT4.8.0,实现VS2010编译调试Qt程序,QtCreator静态发布程序
下载源代码,注意一定是源码压缩包如qt-everywhere-opensource-src-4.8.0.zip, 不是Qt发布的已编译的不同版本的标准库如qt-win-opensource-4.8.0 ...
- Linux下编译静态MinGW环境,编译windows平台Qt程序(使用MXE)
参考链接: MXE.>大多数程序都是在windows平台下开发的程序.windows 在现实中也是绕不过的一个系统平台,做为受过几年VC,MFC”虐待”的程序员,在做为一个程序员之前是一位Lin ...
- 第一讲 一个简单的Qt程序分析
本文概要:通过一个简单的Qt程序来介绍Qt程序编写的基本框架与一些Qt程序中常见的概念 #include <QApplication> #include <QPushButton&g ...
随机推荐
- ionic3 使用html2canvas将数据导出为图片,并下载本地
1.安装html2canvas npm install --save html2canvas 官方网站 https://html2canvas.hertzen.com/ 2.在需要的组件中引入html ...
- cf965C 二分+推方程
#include<bits/stdc++.h> using namespace std; #define ll long long ll n,k,M,D,anss; ll calc(ll ...
- hdu2121 最小树形图的虚根
/* 最小树形图的第二题,终于有了一些理解 具体看注释 */ /* 无定根的最小树形图 建立虚root 每次只找最短的那条入边 最小树形图理解: 第一步:寻找最短弧集E:扫一遍所有的边,找到每个点权值 ...
- C++ 关闭显示器
好困,想躺一下,关灯.上床,笔记本的屏幕还亮着,好刺眼,睡不着! 脑子里出现一个疑问,怎么用C++写一个关闭屏幕的小程序呢? 参考了网上已有的例子,最简化: #include <windows. ...
- 登录界面之Axure原型制作
*****登录界面制作步骤***** 1.背景色:需要设定的背景色不知道色值,可以使用截图工具截取一小块粘贴到axure页面, 点击页面样式中的背景色左上角的取色器点击一下该色块,即可将背景色全部填充 ...
- 数据库解析IP,时间戳
#解析IP SELECT INET_NTOA('168494269'); #解析时间戳 SELECT FROM_UNIXTIME('1505458308');
- C++ Primer 笔记——枚举类型
1.和类一样,每个枚举类型定义了一种新的类型.枚举属于字面值常量类型. 2.C++包含两种枚举:限定作用域的和不限定作用域的.C++11新标准引入了限定作用域的枚举类型. }; // 限定作用域的枚举 ...
- 从零开始 DOM操作 笔记
<div id="box" class="box"></div> --> var myBox = document.g ...
- 论文阅读笔记三:R2CNN:Rotational Region CNN for Orientation Robust Scene Text Detection(CVPR2017)
进行文本的检测的学习,开始使用的是ctpn网络,由于ctpn只能检测水平的文字,而对场景图片中倾斜的文本无法进行很好的检测,故将网络换为RRCNN(全称如题).小白一枚,这里就将RRCNN的论文拿来拜 ...
- B: Ocean的游戏(前缀和)
B: Ocean的游戏 Time Limit: 1 s Memory Limit: 128 MB Submit My Status Problem Description 给定一个字符串s, ...