您好,登錄后才能下訂單哦!
這篇文章主要介紹“C++代碼舉例分析”,在日常操作中,相信很多人在C++代碼舉例分析問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”C++代碼舉例分析”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
所以 v 應該調用它們的析構函數。但是假設在這個調用期間,第二個 Widgets 的析構函數又拋出一個異常。現在有兩個異常同時在活動中,對于C++代碼解析來說這太多了。在非常巧合的條件下發生這樣兩個同時活動的異常,程序的執行會終止或者引發未定義行為。
在本例中,將引發未定義行為。與此相同,使用任何標準庫容器(比如,list,set),任何 TR1中的容器,甚至是一個數組,都可能會引發未定義問題。并非必須是容器或數組才會陷入麻煩。程序夭折或未定義行為是析構函數引發異常的結果。
即使沒有使用容器或數組也會如此。C++ 不喜歡引發異常的析構函數。 這比較容易理解,但是如果你的析構函數需要執行一個可能失敗而拋出異常的操作,該怎么辦呢?例如,假設你與一個數據庫連接類一起C++代碼解析:
class Widget { public: ... ~Widget() { ... } // assume this might emit an exception }; void doSomething() { std::vector<Widget> v; ... } // v is automatically destroyed here
為了確保客戶不會忘記調用 DBconnection 對象的 close,一個合理的主意是為 DBConnection 建立一個資源管理類,在它的析構函數中調用 close。這樣的資源管理類將在以后的文章中探討,但在這里,只要認為這樣一個類的析構函數看起來像這樣就足夠了:
class DBConn { // class to manage DBConnection public: // objects ... ~DBConn() // make sure database connections { // are always closed db.close(); } private: DBConnection db; }; 它允許客戶像這樣編程: { // open a block DBConn dbc(DBConnection::create()); // create DBConnection object // and turn it over to a DBConn // object to manage ... // use the DBConnection object // via the DBConn interface } // at end of block, the DBConn // object is destroyed, thus // automatically calling close on // the DBConnection object
既然能成功地進行C++代碼解析那就好了,但是如果這個調用導致了異常,DBConn 的析構函數將散播那個異常,也就是說,它將離開析構函數。這就產生了問題,因為析構函數拋出了一個燙手的山芋。
到此,關于“C++代碼舉例分析”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。