智能指針 scoped_ptr

scoped_ptr:
 scoped_ptr是一個類似auto_ptr的智能指針,它包裝了new操作符在堆上分配的動態對象,能夠保證動態創建的對象在任何時候都可以被正確的刪除。
 特徵:scoped_ptr的所有權不能轉讓。
操作函數:
 scoped_ptr的構造函數接受一個類型爲T*的指針p,創建出一個scoped_ptr對象,
並在內部保存指針參數p,p必須是一個new表達式動態分配的結果,或是個空指針(0).當scoped_ptr對象的生命期結束時,析構函數~scoped_ptr()會使用delete操作符自動銷燬所保存的指針對象,從而回收資源.
 scoped_ptr 同時把拷貝構造函數和賦值操作符都聲明爲私有的,禁止對智能指針的複製操作,保證了被它管理的指針不能被轉讓所有權。
 成員函數reset()的功能是重置scoped_ptr,它刪除原來保存的指針,在保存新的指針值p,如果p爲空指針,那麼scoped_ptr將不持有任何指針,一般情況reset()不應該被調用,因爲它違背了scoped_ptr的本意--資源應該一直由scoped_ptr自己自動管理.
 scoped_ptr用operator*()和operator->()重載瞭解引用操作符*和箭頭操作符->,以模仿被代理的原始指針行爲,因此可以把scoped_ptr對象如同指針一樣使用,如果scoped_ptr保存空指針,那麼這連個操作的行爲未定義.
 scoped_ptr不支持比較操作,不能在兩個scoped_ptr之間,scoped_ptr和原始指針或空指針之間進行相等或不相等測試,但scoped_ptr提供了一個可以再bool語境(context)中自動轉換成bool值的功能,用來測試scoped_ptr是否持有一個有效的指針,它可以替代與空指針的比較操作。
 成員swap()可以交換兩個scoped_ptr保存的原始指針,它是高效的操作,被用於實現reset() 函數,也可以被boost:swap所利用.
 成員函數get(),它返回scoped_ptr內存保存的原始指針,可以用在某些要求必要的原始指針的場景(如低層的c接口)。但必須小心,將原始指針脫離scoped_ptr的控制,不能對這個指針做delete操作,否則scoped_Ptr析構時會對已經刪除的指針在進行刪除,發送未定義行爲(通常程序崩潰).

與auto_ptr區別:
 auto_ptr特意被設計爲指針的所有權是可以轉移的,可以在函數之間傳遞,同一時刻只能有一個auto_ptr管理指針。它的用法是好的,但轉移語義太過微妙,不熟悉auto_ptr特性的初學者很容易誤用引發錯誤,而scoped_ptr把拷貝構造函數和賦值都聲明爲私有的,拒絕了指針所有權的轉讓--除了scoped_ptr自己,其他任何人都無權訪問被管理的指針,從而保證了指針的絕對安全.
 比起auto_ptr,scoped_ptr更明確地表明瞭代碼原始編寫者的意圖,智能在定義的作用域內使用,不可轉讓,這在代碼後續的維護生命週期中很重要。

發佈了79 篇原創文章 · 獲贊 17 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章