Effective C++ 條款13

使用對象管理資源

在利用對象指針的時候,最後需要刪除對象指針,實現內存釋放,但是有可能在最後的時候,coder忘記釋放了。

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

有可能在delete之前,return了,所以解決這個問題,最好是在析構函數內釋放,這樣 標準庫裏的auto_ptr就起到作用,

void f()
{
  std::auto_ptr<Investment> pInv(createInvestment());  // call factory
                                                       // function
  ...                                                  // use pInv as
                                                       // before
}                                                      // automatically
                                                       // delete pInv via
                                                       // auto_ptr's dtor

不過要注意的一點就是,不能讓多個 auto_ptr 指向同一個對象,否則一旦有一個auto_ptr被自動釋放之後,對象就不存在了(未定義),不過放心,爲了防止這個問題,auto_ptrs 具有不同尋常的特性:拷貝它們(通過拷貝構造函數或者拷貝賦值運算符)就是將它們置爲空(拷貝的時候自動將被拷貝的指針置空)。

sstd::auto_ptr<Investment>                 // pInv1 points to the
  pInv1(createInvestment());              // object returned from
                                          // createInvestment

std::auto_ptr<Investment> pInv2(pInv1);   // pInv2 now points to the
                                          // object; pInv1 is now null

pInv1 = pInv2;                            // now pInv1 points to the
                                          // object, and pInv2 is null

 相對於 auto_ptrs,另一個可選方案是一個引用計數智能指針(reference-counting smart pointer, RCSP)。一個 RCSP 是一個智能指針,它能持續跟蹤有多少對象指向一個特定的資源,並能夠在不再有任何東西指向那個資源的時候刪除它。

 

總結:

  • 爲了防止資源泄漏,使用 RAII 對象,在 RAII 對象的構造函數中獲得資源並在析構函數中釋放它們。

  • 兩個通用的 RAII 是 tr1::shared_ptr 和 auto_ptr。tr1::shared_ptr 通常是更好的選擇,因爲它的拷貝時的行爲是符合直覺的。拷貝一個 auto_ptr 是將它置爲空。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章