日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

构造函数失败_抛出异常

發布時間:2025/3/15 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 构造函数失败_抛出异常 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

網上比較經典的總結:

什么函數都有可能失敗,構造函數也不另外,比如new一個對象或空間不成功。當構造函數失敗的時候,其實很多時候我們不想這個對象被繼續生成,這個時候就可以在構造函數里面拋出異常。C++規定構造函數拋出異常之后,對象將不被創建,析構函數也不會被執行,但已經創建成功的部分(比如一個類成員變量)會被部分逆序析構,不會產生內存泄漏。但有些資源需要在拋出異常前自己清理掉,比如打開成功的一個文件,最好關閉掉再拋出異常(雖然系統也會把這個資源回收),因為拋出異常之后析構函數不會被執行了。

? ? ? (1) C++中通知對象構造失敗的唯一方法那就是在構造函數中拋出異常;(這句話并不是說我們只有這個方法才能讓上層知道構造函數失敗,雖然構造函數沒有返回值,我們完全可以在構造函數中傳入一個引用值,然后在里面設置狀態,運行完構造函數之后任然可以知道是否失敗,但這種情況下面對象其實還是被構造出來的,只是里面有資源分配失敗而已,并且析構函數還是會執行。這和我們構造失敗不生成對象的初衷不符。)

  (2) 構造函數中拋出異常將導致對象的析構函數不被執行;(但已經生產的部分成員變量還是會被逆向析構的)
  (3) 當對象發生部分構造時,已經構造完畢的子對象將會逆序地被析構;

?

網上的一個栗子:

一個實例對象的構造:
第一步,分配足夠的內存,如果失敗就是棧溢出或拋出std::bad_alloc的異常,所以在這步你不用擔心內存泄露,而且這一步你是不能插手的,如果這步成功,就進入第二步。

new運算符的實現保證了內存泄漏不會發生。例如

T *p =?new?T;

將被編譯器轉換給類似下面的樣子:(其實和我們自己釋放已經申請的資源的思想流程是一樣的)

// 第一步,分配原始內存,若失敗則拋出bad_alloc異常 try {// 第二步,調用構造函數構造對象new (p)T; // placement new: 只調用T的構造函數 } catch(...) {delete []p; // 釋放第一步分配的內存throw; // 重拋異常,通知應用程序 } 第二步,調用構造函數,在通常情況下,如果構造函數為空或沒有進行動態內存分配,你就不用關心內存泄露了
你需要關心的是構造函數中有動態內存分配
class A {char* str[10]; public:A(){for(int i=0;i<10;i++)str[i]=NULL; //對str[]初始化,這是必須的,不然再后面delete就會出現問題try{for(int i=0;i<10;i++)str[i]=new char[1024*1024*1024]; //要來就來狠的 }catch(bad_alloc){for(int i=0;i<10;i++)delete []str[i]; //放心,即使delete NULL是不會出問題的throw; //就拋出這個bad_alloc, 這才是構造函數拋出去的異常,外層會撲捉到,并且析構函數不會被調用 }}~A(){for(int i=0;i<10;i++)delete []str[i]; } }; int main() {A *pA=NULL;try{pA=new A;}catch(bad_alloc){cout<<"Out of memory"<<endl;}delete pA;return 0; } pA是用NULL初始化的,即使在給A分配內存時(第一步)失敗,也不會導致后面的delete?pA出錯。

?

對于構造函數可能失敗的做法一般有兩種

1. 在構造函數中拋出異常,本對象構造未完成,它的析構函數不會被調用。當然,我們有義務釋放已經分配到的資源。簡單,最常見。
2. 把資源的初始化工作放在另一個單獨函數中,比如?bool?init(...),由對象創建者(比如工廠方法)先調用構造函數,再調用init方法。ATL中常見。

轉載于:https://www.cnblogs.com/Lunais/p/5674123.html

總結

以上是生活随笔為你收集整理的构造函数失败_抛出异常的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 性久久久久久久 | 亚州黄色 | 91免费版视频 | 亚洲av无码一区二区乱子伦 | 99资源| 成人男女视频 | 国产精品成人一区二区三区 | 亚洲高清免费观看 | 在线观看中文字幕 | 亚洲国产欧洲 | 大奶一区| 亚洲人免费视频 | 国产一区在线观看免费 | 在线观看免费成人 | 91青青视频 | 亚洲av无码一区二区三区在线 | 最新黄色网页 | 720url在线观看免费版 | 国产激情片 | 天天色综合天天 | 秋霞精品一区二区三区 | 免费黄色入口 | 一区二区日韩精品 | 天堂网中文在线观看 | 国产精品婷婷午夜在线观看 | 综合天堂av久久久久久久 | 亚洲欧洲日产av | 国产精品有限公司 | 黄色一级片在线播放 | 绿帽人妻精品一区二区 | 69福利社区 | 五月综合久久 | 蜜臀久久精品久久久久久酒店 | 在线观看国产免费av | 亚洲视频一区二区 | 亚州av片| 人人妻人人爽一区二区三区 | 非洲黑人毛片 | 中文字幕色哟哟 | 香蕉视频在线网址 | 朝桐光在线播放 | 国产成人片 | 精品一区李梓熙捆绑 | 欧美色图激情小说 | 欧美成人一级视频 | 实拍澡堂美女洗澡av | 国产福利电影在线 | 中文字幕欧美另类精品亚洲 | 日韩一区二区三 | 日日噜噜噜噜人人爽亚洲精品 | 成人免费毛片网站 | 91欧美激情一区二区三区成人 | 欧美自拍第一页 | 精品蜜桃一区二区三区 | 欧美一区二区三区成人久久片 | 国产在线观看第一页 | 中文字幕av影视 | 久久精品视频无码 | 91欧美视频| 日出白浆视频 | 亚洲欧美乱综合图片区小说区 | 成人精品免费视频 | 一区二区日韩 | 欧美日韩人妻精品一区二区三区 | 久久久久久欧美精品se一二三四 | 日日色综合 | 久久黑丝| 久久在线视频 | 一区二区三区毛片 | 精品无码av一区二区三区四区 | 国产三级国产精品 | 久久精品一区二区免费播放 | 国产一区二区三区四区视频 | 久久精品无码人妻 | 日韩精品成人一区二区在线 | 国产精品人人爽人人爽 | 久久福利在线 | 精品人妻久久久久一区二区三区 | 人人澡人人爱 | 青青成人在线 | 国产第一精品 | 久久伊人免费视频 | 国产精品破处 | 成人综合激情 | 91色网站 | 亚洲精品综合在线观看 | 亚洲高清视频免费观看 | 激情五月婷婷久久 | 91热爆在线 | 免费观看成人在线视频 | 中文字幕蜜臀 | 国产性xxxx高清 | 精品久久久999 | 免费一级片在线观看 | 奇米影视第四色首页 | 亚洲精品av中文字幕在线在线 | 天天干天天插天天射 | 久久男人视频 | 九热精品 |