理解scope_ptr的內部實現

今天咱們來談論scope_ptr(局部智能指針),咱們將與auto進行區別式進行闡述:函數

1.scope_ptr和auto_ptr相似,可以很是方便正確的刪除建立的的對象。this

2.scope_ptr在獲取對象所指空間的控制權後,是不能將本空間的控制權在交由他人管理。這是與auto_ptr的區別。spa

3.scope_ptr在操做上面,不能實現拷貝構造、=(賦值)、判斷相等或者不等(咱們在這裏實現這些,採用將這些函數寫在類的私有屬性中)。指針

4.最後咱們在詳談當中的reset函數和swap函數:code

typedef scope_ptr<int> this_type;
void
reset(T *p=0) { assert(p != 0 && p != px); this_type(p).swap(*this); } void swap(scope_ptr &b) { T *tmp = b.px; b.px = px; px = tmp; }

reset函數操做流程圖以下:對象

1.this_type是咱們宏定義的一種類類型;this_type(p).swap(*this),傳入參數p調用構造函數建立無名臨時對象來調用swap函數;注意:無名臨時對象出了做用於會自動釋放所指向的空間,因此不會形成內存泄漏。blog

2.在調用swap函數後,this指針的指向會發生變化。注意圖二內存

3.swap函數執行指針交換指向的操做。ci

 

scope_ptr實現代碼以下:it

template<class T>
class scope_ptr { private: scope_ptr(scope_ptr const &); scope_ptr &operator=(scope_ptr const &); void operator==(scope_ptr const &)const; void operator!=(scope_ptr const &)const; public: explicit scope_ptr(T *p = 0) :px(p) {} //構造函數
    ~scope_ptr() { delete px; } public: void reset(T *p=0) { assert(p != 0 && p != px); this_type(p).swap(*this); } void swap(scope_ptr &b) { T *tmp = b.px; b.px = px; px = tmp; } T * operator->()const { assert(px != 0); return px; } T & operator*()const { assert(px != 0); return *px; } private: T *px; }; int main() { int *p = new int(10); scope_ptr<int> pa(p); cout << *pa << endl; return 0; }
相關文章
相關標籤/搜索