Qt程式繼承QApplication發生崩潰的原因

petterchx發表於2021-09-09

一、前情介紹

     QApplication是Qt開發中經常用到的一個類,用來管理應用程式的生命週期。跟其相關的類還有QCoreApplication和QGuiApplication,分別用於不同場景下為應用程式的控制流和事件處理提供基礎的框架。這三個類的建構函式都接收兩個引數(分別是argc和argv),和C/C++程式的main函式的引數差不多。因此,大部分情況下我們是直接將main函式的這兩個引數傳給QApplication(這裡以GUI程式為例):

圖片描述

1 #include <QApplication>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

 本文版權歸24K純開源和部落格園共同擁有,歡迎轉載,但未經作者同意必須保留此宣告,且在文章明顯位置給出原文連結,否則保留追究法律責任的權利。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4606/viewspace-2821845/,如需轉載,請註明出處,否則將追究法律責任。

相關文章