條款13:以對象管理資源

來源:互聯網
上載者:User

標籤:

首先考慮一個工廠函數

Investment * createInvestment();void f(){    Investment * pInv = createInvestment();    ...        delete pInv;}

至少上面這個函數是不安全的,例如如果...裡麵包含return語句的話,
或者說...裡麵包含可能會拋出異常的語句。那麼就會導致申請的記憶體得不到釋放。
而下面就說明了管理對象的一般方法:

void f(){    std::shared_ptr<Investment>(createInvestment());    ...}

用對象來進行管理,這樣在離開範圍的時候申請的記憶體便會自動得到釋放。
注意這裡包含有兩個關鍵的想法:
1. 獲得資源之後應該把他們立刻放到管理對象裡面。
2. 管理對象可以利用解構函式使得資源正確的被釋放。
注意,shared_ptr等智能指標不能對內建的數組進行管理,因為他們在自己的解構函式裡面調用的是

delete而不是delete[], 例如下面這樣就是不可取的:shared_ptr<int> spi(new int[1024]);    //不要這樣做這種情況應該使用vector來代替:shared_ptr<vector> spi(new vector<int>); //像這樣

小結:
1. 為防止資源流失,應該使用RAII對象,他們在建構函式中獲得資源,而在解構函式裡面釋放資源。
2. auto_ptr不能用在多個指標指向同一個對象的場合。

條款13:以對象管理資源

聯繫我們

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