一、前情介绍

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

3. https://stackoverflow.com/questions/22243674/segmentation-fault-when-qt-qapplication-created-with-new/22245111

4. https://stackoverflow.com/questions/35566459/segfault-when-accessing-qapplicationarguments

Qt程序继承QApplication发生崩溃的原因的更多相关文章

  1. [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 ...

  2. 解决Qt程序发布时中文乱码问题(通过QApplication.addLibraryPath加载QTextCodec插件)

    Qt程序的文字编码,是通过插件来解决的,所以我们发布的时候需要把相应的插件也发布出去,在开发者电脑上程序会自动从插件目录加载到插件,但是如果发布给别的电脑使用,需要手动指定插件路径,如下所示: int ...

  3. Ubuntu16.04下写的Qt程序,调试时没问题,运行时偶现崩溃 (需要在运行时生成core dump文件,QMAKE_CC += -g)

    记录一下 Ubuntu16.04下写的Qt程序,调试时没问题,运行时偶现崩溃 需要在运行时生成core dump文件 首先在pro结尾里加入 QMAKE_CC += -g QMAKE_CXX += - ...

  4. Qt程序Release版出现 类似 QEventLoop: Cannot be used without QApplication 问题的终极解决方案

    最近在做Qt程序开发,程序在Debug下跑是没有问题的,发布到Release版本后,出现各种问题: 报各种莫名其妙的错误,类似的错误有:   QEventLoop:Cannot be used wit ...

  5. (转) Qt 出现“undefined reference to `vtable for”原因总结

    由于Qt本身实现的机制所限,我们在使用Qt制作某些软件程序的时候,会遇到各种各样这样那样的问题,而且很多是很难,或者根本找不到原因的,即使解决了问题,如果有人问你为什么,你只能回答--不知道. 今天我 ...

  6. 1.第一个QT程序

    第一个QT程序 应用程序类QApplication 窗口类MyWidget 进入事件循环 a.exec() 头文件 mywidget.h QApplication 文件Demo_pro 我怎么知道我用 ...

  7. VS2010 win7 QT4.8.0,实现VS2010编译调试Qt程序,QtCreator静态发布程序

    下载源代码,注意一定是源码压缩包如qt-everywhere-opensource-src-4.8.0.zip, 不是Qt发布的已编译的不同版本的标准库如qt-win-opensource-4.8.0 ...

  8. Linux下编译静态MinGW环境,编译windows平台Qt程序(使用MXE)

    参考链接: MXE.>大多数程序都是在windows平台下开发的程序.windows 在现实中也是绕不过的一个系统平台,做为受过几年VC,MFC”虐待”的程序员,在做为一个程序员之前是一位Lin ...

  9. 第一讲 一个简单的Qt程序分析

    本文概要:通过一个简单的Qt程序来介绍Qt程序编写的基本框架与一些Qt程序中常见的概念 #include <QApplication> #include <QPushButton&g ...

随机推荐

  1. Confluence 6 外部小工具在其他应用中设置可信关系

    为了在你的 Confluence 中与其他应用建立外部小工具,我们建议你在 2 个应用之间设置 OAuth 或者信任的应用连接关系.在这个例子中,外部应用为小工具的服务器(服务器提供者)和 Confl ...

  2. 【JS】中的原型prototype到底是个啥

    一.什么是原型 原型prototype是函数的一个属性,这个属性是一个指针,指向一个对象(原型对象),这个原型对象的用途是包含可以由特定类型的所有实例共享的属性和方法. 函数也是一种对象.它也是属性的 ...

  3. Dubbo常用配置文件分析及核心源码阅读(SPI.Extension)

    1.多版本支持: 基于上篇博客的 快速启动 Dubbo 服务 的代码进行多版本支持的演示:基于原来的实现类GpHelloImpl ,我们需要新增一个新版本的实类:GpHelloImpl2 public ...

  4. kali linux DVWA config 问题解决方案

    1.下载DVWA之后解压到 var/www/html目录下 unzip DVWA-master.zip -d /usr/www/html 2.配置 打开终端,执行以下命令: 将apache2停止:se ...

  5. mysql入门练习

    2.详细解释列mysql执行语句的每个参数与参数值的含义 ​ mysql -hlocalhost -P3306 -uroot -proot 连接数据库,端口号为3306, 用户名root, 密码roo ...

  6. MySQL:日期函数、时间函数总结

    MySQL 获得当前日期时间 函数 查询昨天,时间拼接 select concat(DATE_FORMAT(date_add(now(), interval -1 day),'%Y-%d-%d'),& ...

  7. sed 详解【转】

    原文地址:http://www.cnblogs.com/sparkdev/archive/2017/07/10/7138073.html 基本命令格式 sed [常用选项] 命令文本 输入 常用选项 ...

  8. ASP.NET Core Middleware管道介绍

    public void Configure(IApplicationBuilder app, IHostingEnvironment env) { app.Use(async (context, ne ...

  9. Orchard是如何工作的?

    文章翻译自http://docs.orchardproject.net/Documentation/How-Orchard-works 对Orchard的理解还不深刻,翻译可能有不好的地方.     ...

  10. [转]Howto: 使用ImageBrush替换PictureMarkerSymbol以加强graphic显示性能

    原文地址:http://support.esrichina-bj.cn/2009/0728/1007.html 文章编号 : 37033 软件: ArcGIS API for Microsoft Si ...