• <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, 評論 - 41, 引用 - 0
            數據加載中……

            CPPEXP —— 構造函數拋異常

            說明

            類的構造函數拋出異常,不會調用該類的析構函數,資源的釋放原則是編譯器申請的編譯器負責,程序員申請的程序員負責。
            在實驗代碼中,子類Except的構造函數拋出異常,則Base和mMember1的構造函數是編譯器調用,因此編譯器會調用它們的析構函數,而mMember2由程序員主動使用new生成,因此需要程序員主動使用delete。

            解決方法:

            1. 在構造函數中使用try...catch結構
            2. 使用類包裝資源申請,如auto_ptr。

            實驗代碼

            1. /**
            2. * @file constructor_exception.cpp
            3. * @brief 測試構造函數異常引起的行為
            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. }

            運行及結果

            $ 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 閱讀(428) 評論(0)  編輯 收藏 引用

            久久久久四虎国产精品| 四虎久久影院| 亚洲va久久久噜噜噜久久男同 | 久久精品无码一区二区三区日韩| 亚洲午夜久久久影院| 国产免费久久精品99re丫y| 精品久久久久久无码中文野结衣| 久久精品国内一区二区三区| 国产精久久一区二区三区| 久久综合久久美利坚合众国| 亚洲∧v久久久无码精品| 久久精品国产亚洲Aⅴ蜜臀色欲| 久久精品国产男包| 精品国产一区二区三区久久蜜臀| 国产69精品久久久久APP下载| 久久A级毛片免费观看| 久久精品无码一区二区三区免费| 人妻丰满AV无码久久不卡| 国产高潮国产高潮久久久91| 久久久久亚洲精品无码蜜桃| 久久国产美女免费观看精品| 2021久久国自产拍精品| 久久中文字幕精品| 久久噜噜久久久精品66| 青青草原综合久久大伊人精品| 久久午夜伦鲁片免费无码| 久久久网中文字幕| 久久午夜无码鲁丝片午夜精品| 伊人久久大香线蕉影院95| 国产V亚洲V天堂无码久久久| 国产L精品国产亚洲区久久| WWW婷婷AV久久久影片| 日韩乱码人妻无码中文字幕久久 | 97精品依人久久久大香线蕉97 | 91精品国产综合久久婷婷| 久久精品一本到99热免费| 噜噜噜色噜噜噜久久| 国内精品综合久久久40p| 亚洲?V乱码久久精品蜜桃 | 精品久久久无码人妻中文字幕豆芽| 色狠狠久久综合网|