• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 51, 文章 - 1, 評(píng)論 - 41, 引用 - 0
            數(shù)據(jù)加載中……

            CPPEXP —— 構(gòu)造函數(shù)拋異常

            說明

            類的構(gòu)造函數(shù)拋出異常,不會(huì)調(diào)用該類的析構(gòu)函數(shù),資源的釋放原則是編譯器申請(qǐng)的編譯器負(fù)責(zé),程序員申請(qǐng)的程序員負(fù)責(zé)。
            在實(shí)驗(yàn)代碼中,子類Except的構(gòu)造函數(shù)拋出異常,則Base和mMember1的構(gòu)造函數(shù)是編譯器調(diào)用,因此編譯器會(huì)調(diào)用它們的析構(gòu)函數(shù),而mMember2由程序員主動(dòng)使用new生成,因此需要程序員主動(dòng)使用delete。

            解決方法:

            1. 在構(gòu)造函數(shù)中使用try...catch結(jié)構(gòu)
            2. 使用類包裝資源申請(qǐng),如auto_ptr。

            實(shí)驗(yàn)代碼

            1. /**
            2. * @file constructor_exception.cpp
            3. * @brief 測(cè)試構(gòu)造函數(shù)異常引起的行為
            4. * @copyright public domain
            5. */
            6. #include <iostream>
            7. #include <exception>
            8. #include <memory>
            9. class Base {
            10. public:
            11. Base() { std::cout << "Base()" << std::endl; }
            12. virtual ~Base() { std::cout << "~Base()" << std::endl; }
            13. };
            14. class Member {
            15. public:
            16. Member(int id):mId(id) { std::cout << "Member():" << mId << std::endl; }
            17. virtual ~Member() { std::cout << "~Member()" << mId << std::endl; }
            18. protected:
            19. int mId;
            20. };
            21. class Except : public Base {
            22. public:
            23. Except() : mMember1(1), mMember2(NULL) {
            24. std::cout << "Except() enter" << std::endl;
            25. mMember2 = new Member(2);
            26. mMember3.reset(new Member(3));
            27. throw std::exception();
            28. std::cout << "Except() leave" << std::endl;
            29. }
            30. virtual ~Except() {
            31. delete mMember2;
            32. std::cout << "~Except()" << std::endl;
            33. }
            34. protected:
            35. Member mMember1;
            36. Member *mMember2;
            37. std::auto_ptr<Member> mMember3;
            38. };
            39. int main() {
            40. try {
            41. Except e;
            42. } catch (std::exception& e) {
            43. std::cout << e.what() << std::endl;
            44. }
            45. return 0;
            46. }

            運(yùn)行及結(jié)果

            $ g++ constructor_exception.cpp 
            $ ./a.out 
            Base()
            Member():1
            Except() enter
            Member():2
            Member():3
            ~Member()3
            ~Member()1
            ~Base()
            std::exception
            




            posted on 2016-04-30 10:17 lemene 閱讀(417) 評(píng)論(0)  編輯 收藏 引用


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            久久天天日天天操综合伊人av| 精品久久久久久久国产潘金莲| 欧美亚洲色综久久精品国产| 国产精品9999久久久久| 99久久国产主播综合精品| 一本久道久久综合狠狠躁AV| 久久综合给合久久国产免费| 一级做a爱片久久毛片| 狠狠综合久久AV一区二区三区| 欧美亚洲另类久久综合| 亚洲人成无码久久电影网站| 久久精品国产精品亚洲毛片| 久久久久久国产精品美女| 久久99精品国产麻豆| 久久综合伊人77777| 久久这里只有精品首页| 中文字幕乱码久久午夜| 亚洲国产成人久久精品99 | 蜜臀久久99精品久久久久久小说| 99久久er这里只有精品18| 狠狠综合久久综合88亚洲| 午夜精品久久久久久| 久久男人AV资源网站| 99久久99久久精品国产| 9久久9久久精品| 久久久久久久97| 国产亚洲精品自在久久| 亚洲国产另类久久久精品小说| 久久只有这里有精品4| 伊人久久国产免费观看视频 | 9久久9久久精品| 99re这里只有精品热久久| 国产999精品久久久久久| 亚洲色欲久久久久综合网| avtt天堂网久久精品| 亚洲AV伊人久久青青草原| 久久艹国产| 久久中文字幕视频、最近更新| 国内精品久久久久久中文字幕| 一本一道久久精品综合| 国产精品熟女福利久久AV|