国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表
主站蜘蛛池模板: 英超| 民乐县| 河西区| 富平县| 永康市| 尉氏县| 集贤县| 松溪县| 西安市| 阜平县| 淮滨县| 沙田区| 二连浩特市| 库车县| 旬邑县| 股票| 盐津县| 金昌市| 临朐县| 锦州市| 定边县| 齐河县| 马边| 广丰县| 垫江县| 迭部县| 阿荣旗| 庆安县| 麻城市| 新化县| 景泰县| 吉木乃县| 佳木斯市| 集贤县| 囊谦县| 奉贤区| 温州市| 诸暨市| 呼和浩特市| 开远市| 南开区|