引子:C++中如何有效管理分配在堆中的對象

來源:互聯網
上載者:User
考慮以下函數:

void f()
{
Investment *pInv = createInvestment(); // call factory function
... // use pInv
delete pInv; // release object
}

問題: delete pInv一定會被執行嗎?當然不是!
隨便列舉幾種情形。有可能在這個函數的 "..." 部分的某處有一個提前出現的 return 語句。如果這樣一個 return 執行了,控制流程程就再也無法到達 delete 語句。還可能發生的一個類似情況是如果 createInvestment 的使用和刪除在一個迴圈裡,而這個迴圈以一個 continue 或 goto 語句提前退出。還有,"..." 中的一些語句可能拋出一個異常。如果這樣,控制流程程不會再到達那個 delete。無論那個 delete 被如何跳過,我們泄漏的不僅僅是容納 investment 對象的記憶體,還包括那個對象持有的任何資源。還有,為了對軟體進行維護,一些人可能會在沒有完全把握對這個函數的資源管理原則的其它部分的影響的情況下增加一個 return 或 continue 語句。尤有甚者,f 的 "..." 部分可能調用了一個從不慣於拋出異常的函數,但是在它被“改良”後突然這樣做了。依賴於 f 總能到達它的 delete 語句根本靠不住。

如何保證分配在堆上的對象一定可以釋放?
方法一:使用smart pointer,如TR1的shared_ptr。使用它們的解構函式確保資源被釋放。因為當一個對象被銷毀時(例如,當一個對象離開其活動範圍)會自動調用解構函式,無論控制流程程是怎樣離開一個塊的,資源都會被正確釋放。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.