/*
* 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...