感覺auto_ptr還是存在一些不足的,效率十分低,而且丟失了一般指標方便常用的操作,如++,--等,auto_ptr只過載了=,*,->這幾個操作符,所以使用很不方便。
一、說明:int *a = null;delete a;//do nothing
應此auto_ptr的析構函式是這樣子的:
~auto_ptr()
二、auto_ptr中有乙個很重要的函式release
_ty *release() _throw0()
_ty *_tmp = _myptr;
_myptr = 0;
return (_tmp);
}
該函式的作用是將自身指標交給release的返回值,而自身指標指null
三、 每次拷貝的時候都會呼叫release函式
auto_ptrp1(new int);
//執行以下**後,p1將失效,p1=null
auto_ptrp2(p1);或auto_ptrp2 = p1;
這樣可以保證只有乙個auto_ptr指標指向每個new 對像,從而避免重複delete,
不過也有乙個最大的弊病,就是不符合使用習慣,
如果在賦值後使用原指標,將導致使用null指標而崩潰。
個人覺得,如果使用引用計數,當乙個記憶體區不再被任何指標指向時delete掉,這樣可能會好一點。
封裝了指標類用起來跟指標本身一樣才好.所以需要過載-> , * 等運算子
template< class t>
class my_auto_ptr
~my_auto_ptr()
t& operator*()
t* operator->() }
現在my_auto_ptr可以變得很像指標了
my_auto_ptrmp(new int(88) ); //等價int* ip = new int(88);
int num = *mp; //等價int num = *ip;
假如有這樣的類struct arwen
則my_auto_ptrmp( new arwen); //等價arwen* ip = new arwen;
mp->test(); //等價ip-test();
乙個完善點的類往往還涉及到複製構造的一些操作.也可以做把另外乙個智慧型指標類做為建構函式的引數,或者通過=給乙個類賦值
template< class t>
class my_auto_ptr
public:
explicit my_auto_ptr( t* p = 0) :m_ptr( p )
~my_auto_ptr()
t& operator*()
t* operator->()
my_auto_ptr(my_auto_ptr& mp)
my_auto_ptr& operator=(my_auto_ptr& ap)
return *this;
}void reset(t* p)
};
stl智慧型指標auto ptr
感覺auto ptr還是存在一些不足的,效率十分低,而且丟失了一般指標方便常用的操作,如 等,auto ptr只過載了 這幾個操作符,所以使用很不方便。一 說明 int a null delete a do nothing 應此auto ptr的析構函式是這樣子的 auto ptr 二 auto p...
STL 智慧型指標auto ptr
c 中指標申請和釋放記憶體通常採用的方式是new和delete。然而標準c 中還有乙個強大的模版類就是auto ptr,它可以在你不用的時候自動幫你釋放記憶體。下面簡單說一下用法。cpp view plain copy 用法一 std auto ptrm example new myclass 用法...
auto ptr智慧型指標
1 class auto ptr 這個智慧型指標應該保證,無論在何種情形下,只要自己被摧毀,就一定連帶釋放其所指資源。而由於智慧型指標本身就是區域變數,所以無論是正常退出,還是異常退出,只要函式退出,它就一定會被銷毀。注意 auto ptr不允許使用一般指標慣用的賦值 assign 初始化方式。必須...