C++ try 塊裡 new 類對像構造異常時發生“回退”並對資源自動釋放

來源:互聯網
上載者:User

       考慮如下代碼:

void* operator new ( size_t size )<br />{<br /> printf ( "Malloc running! Size: %u/n", size );<br /> return malloc ( size );<br />}<br />void operator delete ( void* memblock )<br />{<br /> printf ( "Free running!/n" );<br /> free ( memblock );<br />}<br />class Fck<br />{<br />public:<br /> Fck () { printf ( "Fck Constructing/n" ); }<br /> ~Fck() { printf ( "Fck Destructing/n" ); }<br />};<br />int _tmain(int argc, _TCHAR* argv[])<br />{<br /> delete new Fck ();<br /> return 0;<br />} 

       運行之,控制台顯示資訊如下:

       可以清晰地看到 new 類對像時,先分配空間再構造;delete 時,先析構再釋放空間的步驟。

       再考慮如下代碼:

void* operator new ( size_t size )<br />{<br /> printf ( "Malloc running! Size: %u/n", size );<br /> return malloc ( size );<br />}<br />void operator delete ( void* memblock )<br />{<br /> printf ( "Free running!/n" );<br /> free ( memblock );<br />}<br />class Fck<br />{<br />public:<br /> Fck ()<br /> {<br /> printf ( "Fck Constructing/n" );<br /> throw int ( /*5*/ );<br /> }<br /> ~Fck() { printf ( "Fck Destructing/n" ); }<br />};<br />int _tmain(int argc, _TCHAR* argv[])<br />{<br /> try { new Fck (); }<br /> catch ( int& i ) { printf ( "Error no.: %d/n", i ); }<br /> return 0;<br />} 

       這裡先注釋掉 Fck 類建構函式中的那句 throw int ()。建構函式不會拋出異常。運行之,控制台顯示資訊如下:

       結果很好理解。try 塊中成功 new 出 Fck 類對像,程式控制流程並未要求去顯式 delete 掉它,因此對該類對像的析構和釋放資源的過程不會執行。

       問題不在這兒,若我在建構函式中拋出異常將如何?將注釋掉的那句 throw int () 恢複,則代碼將直接從建構函式中拋出異常。關於類建構函式處理異常更安全的用法請見《C++ 類建構函式初始化列表的異常機制 function-try block》《續:為何說 C++ 建構函式初始化列表異常機制是必要的》兩篇文章。

       運行之,控制台顯示資訊如下:

       發現 delete 算符重載方法被執行了,資源被釋放,而沒有解構函式調用的資訊。沒有析構是可以理解的,因為對像構造失敗,對像並沒構造完成,它沒有生出來,就沒辦法去搞死它。在 new Fck () 這句設斷點,發現執行完 new 算符後,箭頭又跳了回來,然後流程再跳到建構函式中去。也就是說,new Fck () 過程的確是分兩步執行的。這句執行到第二步發生異常時,try 塊讓第一步發生了“回退”,也即執行了 new 的反操作 delete 了。這很有意思。

       更多請參考:《C++異常處理須知》

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.