国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

new失敗的處理方法

2019-11-08 02:21:55
字體:
來源:轉載
供稿:網友

new失敗的處理方法

常常會見到這樣的代碼:

int *p=new int;if(p!=0){ return -1;}

實際上,現在new失敗的處理方法是拋出bad_alloc()異常,所以上述代碼實際上不會執(zhí)行到return -1;的部分,new失敗不會將指針置空。

正確處理方式應該是這樣:

1、new之后catch異常:int main(){ const int size=10*1024*1024; for (int i=0;;++i) { cout<<i<<endl; try { auto p=new char[size]; } catch(const bad_alloc&e) { cout<<"bad alloc"<<endl; break; } } cout<<"end"<<endl; getchar(); return 0;}

結果如下這里寫圖片描述 程序在new失敗之后拋出異常,捕獲異常之后正常退出,沒有發(fā)生崩潰等現象。

2、使用set_new_handler,異常之后會先調用這個函數,函數里邊可以提示用戶啥的,也不會直接崩潰:void new_handle(){ cerr<<"bad alloc"<<endl; getchar(); exit(1);}int main(){ set_new_handler(new_handle); const int size=10*1024*1024; for (int i=0;;++i) { cout<<i<<endl; auto p=new char[size]; } cout<<"end"<<endl; getchar(); return 0;}

結果如下這里寫圖片描述 - 3、使用std::nothrow處理,這時new失敗的話不拋出bad_alloc異常,而是將指針置0,那么檢測指針為0處理即可:

int main(){ const int size=10*1024*1024; for (int i=0;;++i) { cout<<i<<endl; auto p=new(std::nothrow) char[size]; if(p==0) { cerr<<"bad alloc"<<endl; break; } } cout<<"end"<<endl; getchar(); return 0;}

結果如下這里寫圖片描述

小結

1、舊編譯器new依然返回0標志著失敗,但是很多編譯器已經以異常處理的處理了2、異常處理方法比較麻煩3、set_new_handler處理比較好4、std::nothrow每次new都需要寫std::nothrow也比較麻煩5、實際上new失敗的情況是比較少見的,大部分情況不需要處理,不然太麻煩,但是對要求較高的代碼還是應該仔細處理,然后是對申請大內存的代碼也應當做處理
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 嘉荫县| 嘉黎县| 东山县| 阳原县| 江津市| 洪雅县| 日照市| 驻马店市| 五指山市| 泸水县| 荃湾区| 法库县| 龙南县| 泽普县| 河源市| 定陶县| 泗阳县| 固镇县| 新密市| 中超| 丁青县| 广州市| 新疆| 万盛区| 朝阳市| 鹤壁市| 萝北县| 会昌县| 宝清县| 怀柔区| 抚宁县| 读书| 枣阳市| 万荣县| 曲周县| 开化县| 当阳市| 定边县| 徐水县| 江孜县| 渭源县|