Boost筆記(一) —— Smart_ptr庫

前言:讀《超越c++標準庫——boost程序庫導論》的筆記。

(一)scoped_ptr

  • boost::scoped_ptr 用於確保能夠正確地刪除動態分配的對象。scoped_ptr 有着與std::auto_ptr類似的特性,而最大的區別在於它不能轉讓所有權而auto_ptr可以。事實上,scoped_ptr永遠不能被複制或被賦值!scoped_ptr 擁有它所指向的資源的所有權,並永遠不會放棄這個所有權。
  • 它是一種輕量級的智能指針 
  • scoped_ptr的構造函數explicit scoped_ptr(T* p=0)的參數必須是用operator new分配的,或者是null。

          與std::auto_ptr一樣,由於析構函數使用delete,而非delete[]刪除資源,所以參數不能指向數組,如:

             boost::scoped_ptr<char>  p(new char[20]);

      將導致資源泄露。這裏完全可用std::string之類的容器代替。

  • 你的詞典裏有了scoped_ptr,你就應該使用它,因爲它可以更清楚地表明你的意圖。如果你想說一個資源是要被限制在作用域裏的,並且不應該有辦法可以放棄它的所有權,你就應該用 boost::scoped_ptr.
  • 使用裸指針來寫異常安全和無錯誤的代碼是很複雜的。使用智能指針來自動地把動態分配對象的生存期限制在一個明確的範圍之內,是解決這種問題的一個有效的方法,並且提高了代碼的可讀性、可維護性和質量。
  • scoped_ptr不提供拷貝構造函數,以及operator=、operator==和operator!=。

  • 在以下情況時使用 scoped_ptr

    • 在可能有異常拋出的作用域裏使用指針

    • 函數裏有幾條控制路徑

    • 動態分配對象的生存期應被限制於特定的作用域內

    • 異常安全非常重要時(始終如此!)

  (二)scoped_array

  • 由於boost::scoped_ptr不能指向數組,所以有了boost::scoped_array。原因:scoped_array是一個單獨的類而不是scoped_ptr的一個特化的原因是,因爲不可能用元編程技術來區分指向單個對象的指針和指向數組的指針。不管如何努力,也沒有人能發現一種可靠的方法,因爲數組太容易退化爲指針了,這使得沒有類型信息可以表示它們是指向數組的。結果,只能由你來負責用scoped_array來代替scoped_ptr,就如你必須用delete[]操作符來代替delete操作符一樣。
  • 用處不大,最好還是使用std::vector,它更靈活、更強大。只有當你需要確保數組的大小是固定的時候,才使用scoped_array 來替代 std::vector.
發佈了25 篇原創文章 · 獲贊 9 · 訪問量 30萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章