我發現有三種捕獲異常的方法,有什么區別?1)抓住價值;2)通過引用捕獲;3)被指針抓?。晃抑恢腊粗挡东@將調用該對象的兩個副本,按引用捕獲將調用一個對象。那么指針捕獲又如何呢?何時使用指針捕獲?除了拋出一個對象,我還能拋出一個指向這樣的對象的指針嗎?class A {}void f() { A *p = new A(); throw p;}
3 回答

千巷貓影
TA貢獻1829條經驗 獲得超7個贊
推薦的方法是按值拋出并按引用捕獲。
您的示例代碼將拋出一個指針,這是一個壞主意,因為您將不得不在捕獲站點上管理內存。
如果您確實覺得應該拋出一個指針,請使用諸如的智能指針shared_ptr
。
無論如何,Herb Sutter和Alexei Alexandrescu在我解釋的C ++編碼標準書中對此做了很好的解釋。

偶然的你
TA貢獻1841條經驗 獲得超3個贊
捕獲遵循正常的分配兼容性規則,也就是說,如果您拋出一個值,則可以將其捕獲為值或引用,但不能將其捕獲為指針。如果拋出指針,則只能將其作為指針(或對指針的引用...)來捕獲。
但是拋出指針并沒有任何意義,只會引起內存管理的麻煩。因此,通常應遵循按值拋出的規則,按引用捕獲的規則,如Gregory所述。

jeck貓
TA貢獻1909條經驗 獲得超7個贊
盡管實際上可以拋出任何類型的任何對象,但這樣做幾乎沒有什么收獲(如果有的話)。動態分配主要在對象的生存期不適合自動分配的情況下有用,例如,您希望其生存期獨立于常規程序范圍。
但是,對于異常對象,這實際上沒有多大意義。通常,異常對象僅在異常處理程序內部使用,并且您明確希望在退出該異常的(最后一個)處理程序時將其銷毀。
還有一個事實是,您通常希望保持異常處理代碼相當簡單。僅舉例來說,如果您要報告已耗盡或損壞的免費存儲/堆,則嘗試從已耗盡/損壞的免費存儲/堆中分配異常對象通常無法很好地工作...
- 3 回答
- 0 關注
- 642 瀏覽
添加回答
舉報
0/150
提交
取消