Qt程式繼承QApplication發生崩潰的原因
一、前情介紹
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- app 崩潰的原因APP
- Linux中程式崩潰及重啟的原因詳解!Linux
- 伺服器站點崩潰的原因有哪些伺服器
- Qt QWidget Must construct a QApplication before a QWidgetQTStructAPP
- Windows下Qt使用dump定位崩潰位置(1)WindowsQT
- 伺服器停機或者崩潰的原因有哪些伺服器
- iOS開發的底線-崩潰iOS
- 解決Qt中ui->tableView->setModel(model);導致程式崩潰 問題QTUIView
- odoo 繼承(owl繼承、web繼承、view繼承)Odoo繼承WebView
- 我們分析了100個移動應用程式,發現了App崩潰的6個常見原因!APP
- [翻譯]Java排錯指南 - 5 確定崩潰何地發生Java
- WWDC 2018:理解崩潰以及崩潰日誌
- 一個不相容的 JS 方法,讓你的網站發生崩潰JS網站
- 突發:當機崩潰OOMOOM
- C++記錄程式崩潰時的dumpfileC++
- 測試必存!12種網站崩潰的原因及排查方法!網站
- MySQL 資料庫崩潰(crash)的常見原因和解決辦法MySql資料庫
- ICU探測字串字符集的時候總是崩潰的原因字串
- Javascript繼承4:潔淨的繼承者—-原型式繼承JavaScript繼承原型
- iOS開發-stringByEvaluatingJavaScriptFromString導致崩潰iOSJavaScript
- 菱形繼承,虛繼承繼承
- 原型,繼承——原型繼承原型繼承
- 成都、貴州核酸檢測系統“崩潰”背後的技術原因
- 讓 Chrome 崩潰的一行 CSS 程式碼ChromeCSS
- VS2005(vs2008,vs2010)使用map檔案查詢程式崩潰原因
- 【Azure Cloud Services】雲服務頻繁發生伺服器崩潰的排查方案Cloud伺服器
- win10系統崩潰藍屏什麼原因 win10系統出現崩潰藍屏如何修復Win10
- Android 收集程式崩潰異常資訊Android
- APP防崩潰APP
- 崩潰日記
- Facebook是如何防止訊息系統在新年前夕發生崩潰?
- C++中公有繼承、保護繼承、私有繼承的區別C++繼承
- 類的繼承_子類繼承父類繼承
- 生產級部署 Python 指令碼,崩潰可自啟!Python指令碼
- 多繼承 與 多重繼承繼承
- 關於Mozilla崩潰的研究
- Go程式崩潰現場應該如何保留?Go
- Javascript繼承2:建立即繼承—-建構函式繼承JavaScript繼承函式