讀C Primer 之智慧型指標

2021-05-27 07:20:52 字數 1581 閱讀 5622

/*

* author: xizero00

* mail:[email protected]

* date:2011-08-07 20:19:11

* smart pointer sample

*/#include using namespace std;

//智慧型指標類

class smartptr

//析構函式

~smartptr() };

//使用智慧型指標的類

//使用智慧型指標的類一般需要 複製建構函式、賦值操作符過載、析構函式

class hasptr

//帶引數的建構函式

hasptr( int *p , int v ): ptr( new smartptr( p ) ) , val( v ) {}

//複製建構函式

hasptr( const hasptr &h ): ptr( h.ptr ) , val( h.val )

//賦值過載,用於對賦值操作進行監控

hasptr& operator= ( const hasptr& );

//析構函式,監控刪除操作

~hasptr() // 判斷是否為最後乙個引用

//屬性

int get_int() const

void set_int( int v )

int* get_ptr() const

void set_ptr( int *p )

};//賦值操作符蟲過載

hasptr& hasptr::operator= (const hasptr &h)

ptr = h.ptr;

val = h.val;

return *this;

}int main(int argc , char **argv)

; hasptr *h1 = new hasptr( obj , 2 );

//hasptr *h2 = new hasptr( obj , 1 );

hasptr h3 = *h1;//引用h1其中的指向資料的指標兩次

cout << "h1:" << *( h1->get_ptr() ) << endl;

cout << "h3:" << *( h3.get_ptr() ) << endl;

cout << "刪除h1,此時剩下h3" << endl;

//如果不用智慧型指標會導致obj所指向的資料被刪除了,

//而h3中的會成為懸垂指標

//因為這裡使用類智慧型指標

//所以不會刪除obj所指向的資料的空間,所以不會出錯!

delete h1;

cout << "h3:" << *( h3.get_ptr() ) << endl;

//cout << "h2:" << *h2.get_ptr() << endl;

return 0;

}

編譯的環境是g++ 因為陣列的初始化用到了c++ 0x的特性,所以編譯命令為

g++ hasptr.cc -std=c++0x

c primer筆記 智慧型指標

智慧型指標的陷阱 基本規範 1.不使用相同的內建指標值初始化 或reset 多個智慧型指標。double free 2.不delete get 返回的指標。double free 3.不使用get 初始化或reset另乙個智慧型指標。double free 4.如果你使用get 返回的指標,記住當最...

C Primer 筆記 智慧型指標

1.新的標準庫提供了兩種智慧型指標型別,shared ptr允許多個指標指向同乙個物件,unique ptr則獨佔所指的物件。標準庫還定義了乙個名為weak ptr的伴隨類,它是一種弱引用,指向shared ptr所管理的物件。2.智慧型指標也是模板,預設初始化的智慧型指標中儲存著乙個空指標。3.智...

智慧型指標之獨佔指標

2.unique ptr 獨佔指標 獨佔型的指標不允許其它的智慧型指標共享其內部的指標,不允許通過賦值將乙個unique ptr賦值給另外乙個unique ptr unique ptr p1 new int 10 unique ptr p2 p1 錯誤的,不能複製給乙個獨佔的智慧型指標 unique...