Qt中的異常安全
回答
C++有錯誤時拋出安全一個非常強大的機制。由於例外,析構函數針對所有超出範圍的變量運行。這與Java等語言不同,其中異常安全性要求程序員正確地獲得catch
和finally
條款。
調用析構函數的C++行爲可以與堆棧中的Qt對象無縫協作。 Qt類都具有析構函數,並且都不需要手動清理。此外,QSharedPointer<T>
可用於管理堆分配的Qt對象;當最後一個指針超出範圍時,該對象被銷燬。這包括指針由於例外而超出範圍的情況。
因此,Qt中肯定存在異常安全。這只是透明的。
我認爲QSharedPointer的問題在於它沒有在很多地方使用。例如,QLayout期望QWidget *具有QLayout成爲其內存管理器的期望。我們不能在這裏使用QSharedPointer,因爲QLayout在從佈局中移除時應該刪除它。 :-( – stinky472 2012-01-31 19:50:33
)作者的原帖稱:「只要我看到Qt應用程序中的異常處理並不是非常流行」,QSharedPointer的存在並不會改變,因爲QT API及其示例的很少部分實際上使用它。而是我們有一些例子,如QButton * button = new QButton(...); QVBoxLayout * layout = new QVBoxLayout(...);這個庫在大多數情況下不會被編碼爲異常安全。應該加以解決,並讓圖書館的更多部分接受和存儲QSharedPointer將是一個非常好的解決方案。 – stinky472 2012-02-01 15:26:46
我最好的做法是不要在基於Qt的代碼中使用(或至少避免它們)C++異常,這使得處理它們不成問題。但Qt並不是真正的原因,我只是覺得異常往往會使事情變得不必要地複雜得多。但它可以幫助的Qt本身大多是例外的煩惱免費... :)
Qt是(主要)也不例外安全:http://doc.qt.io/archives/4.6/exceptionsafety.html
在另一方面處理異常正確的事件驅動編程很難 ,所以最好的 是爲了避免他們在使用Qt和傳遞錯誤代碼。
爲什麼在事件驅動編程中正確處理異常是非常困難的? – metdos 2011-04-07 13:37:25
Qt等級爲exception neutral
,如documentation中所述。
你應該堅持使用布爾值來處理錯誤條件,就像Qt本身一樣。
由於Qt必須支持許多不同的平臺(可移植性和異常不能很好地混合在一起),所以不會在內部使用異常。
再次,從文檔:
目前,唯一支持的用例用於從內Qt的拋出的異常中恢復(例如,由於內存不足)是退出事件循環和之前做一些清理退出應用程序。 典型使用案例:
QApplication app(argc, argv);
...
try {
app.exec();
} catch (const std::bad_alloc &) {
// clean up here, e.g. save the session
// and close all config files.
return 0; // exit the application
}
- 1. 安全異常
- 2. MVC3中的安全異常
- 3. asp.net中的安全異常
- 4. .net安全異常
- 5. ASP.NET安全異常
- 6. WCF安全異常
- 7. javax.security.auth.login.LoginException:安全異常
- 8. Java安全異常
- 9. OLEDB安全異常
- 10. Ninject.MockingKernel.Moq安全異常
- 11. WindowsIdentity.GetCurrent()上的安全異常
- 12. 安全異常與Thread.Abort的
- 13. Azure雲服務中的安全異常
- 14. Sharepoint 2010 SPImport.Run安全異常
- 15. ,一個安全異常
- 16. Linq to SQL - 安全異常
- 17. System.Web.Mvc.UrlHelper.GenerateUrl錯誤安全異常
- 18. 1and1安全異常問題
- 19. 異常安全和make_unique
- 20. std :: unique_ptr和異常安全
- 21. 發生安全異常
- 22. Telerik RadTabStrip + OWASP安全異常
- 23. Domino nvapplet.jar安全異常
- 24. JwtBearerAuthentication安全句柄異常
- 25. C++ unordered_map異常安全
- 26. 是uninitialized_copy()異常安全嗎?
- 27. Sql-Clr安全異常
- 28. CKEditor .Net安全異常
- 29. 安全異常錯誤
- 30. 使功能異常安全
QT是一個非常古老的圖書館,在異常安全方面非常差。考慮如何將所有小部件分配到堆中,但是RAII沒有智能指針。最好的辦法是將它們分配到auto_ptr中,並在插入時將內存釋放到父級/佈局。他們有一些基本的規定,比如QMutexLocker,因爲拋出一個互斥鎖被鎖定會是災難性的,但是他們需要提供更多的工作或者一大堆工作,您必須自己去做,以便以一種異常安全的方式使用qt 。 – stinky472 2010-06-28 13:59:32
@ stinky472:錯了。 [QSharedPointer](http://doc.trolltech.com/4.6/qsharedpointer.html) – MSalters 2010-06-28 14:25:44
@ stinky472:哪個GUI工具包允許小部件被堆棧分配?你爲什麼要這樣做?聽起來像是一個「稻草人」的說法。 – kevinarpe 2011-12-30 08:50:46