智慧型指標 scoped ptr

2021-06-10 07:48:36 字數 1386 閱讀 5293

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更明確地表明了**原始編寫者的意圖,智慧型在定義的作用域內使用,不可轉讓,這在**後續的維護生命週期中很重要。

智慧型指標ScopedPtr

防拷貝的兩個條件 1 保護限定符 類外無法定義 2.顯示進行宣告 不進行宣告,系統將會自動生成預設的,是淺拷貝 這種方法簡單,粗暴。不讓使用拷貝構造和賦值運算子過載,你進行使用會編譯錯誤 如下 templateclass scopedptr scopedptr protected scopedptr...

Boost智慧型指標 scoped ptr

boost scoped ptr和std auto ptr非常類似,是乙個簡單的智慧型指標,它能夠保證在離開作用域後物件被自動釋放。下列 演示了該指標的基本應用 include include include class implementation void do something void t...

Boost智慧型指標 scoped ptr

boost scoped ptr和std auto ptr非常類似,是乙個簡單的智慧型指標,它能夠保證在離開作用域後物件被自動釋放。下列 演示了該指標的基本應用 include include include class implementation void do something void t...