1、class auto_ptr 這個智慧型指標應該保證,無論在何種情形下,只要自己被摧毀,就一定連帶釋放其所指資源。而由於智慧型指標本身就是區域變數,所以無論是正常退出,還是異常退出,只要函式退出,它就一定會被銷毀。
注意:auto_ptr不允許使用一般指標慣用的賦值(assign)初始化方式。必須直接使用數值來完成初始化:
s td::auto_ptrptr1(new classa); //ok
std::auto_ptrptr2 = new classa; //error
auto_ptr所界定的乃是一種嚴格的擁有權觀念。也就是說,由於乙個auto_ptr會刪除其所指物件,所以這個物件絕對不能同時被其他物件「擁有」。絕對不應該出現多個auto_ptrs同時擁有乙個物件的情況。
//initializean auto_ptr with a new object
std::auto_ptrptr1 (new classa);
//copy theauto_ptr and transfers ownership from ptr1 to ptr2
std::auto_ptrptr2 (ptr1);
在第乙個語句中,ptr1擁有了那個new出來的物件。在第二個語句中,擁有權由ptr1轉交給ptr2.此後ptr2就擁有了那個new出來的物件,而ptr1不再擁有它。這樣,物件就只會被delete一次——在ptr2被銷毀的時候。
2、總而言之,常數型auto_ptr減少了「不經意轉移擁有權」所帶來的危險。只要乙個物件通過autor_ptr傳遞,就可以使用常數型auto_ptr來終結擁有權轉移鏈,此後擁有權將不能再進行轉移。
std::auto_ptrf()
conststd::auto_ptrp(new int); //no ownership transfer possible
std::auto_ptrq(new int); //ownership transfer possible
*p= 42; //ok, change value towhich p refer
bad_print(p); //compile-time error
*p= *q; //ok, change value to which prefer
p= q; //compile-timeerror
returnp; //compile-time error
如果使用const auto_ptr作為引數,對新物件的任何賦值操作都將導致編譯期錯誤。就常數特性而言,const auto_ptr比較類似常數指標(t* const p),而非指向常數的指標(const t* p)。
3、auto_ptr的常見錯誤運用
a.auto_ptr之間不能共享擁有權
b.並不存在針對array而設計的auto_ptrs
c.auto_ptrs決非乙個「四海通用」的智慧型指標
d.auto_ptrs不滿足stl容器對其元素的要求
智慧型指標 AutoPtr
include include include using namespace std void func autoptr 析構函式來負責釋放 void test catch exception e autoptr 析構函式來負責釋放 private t ptr struct aa void fun...
stl智慧型指標auto ptr
感覺auto ptr還是存在一些不足的,效率十分低,而且丟失了一般指標方便常用的操作,如 等,auto ptr只過載了 這幾個操作符,所以使用很不方便。一 說明 int a null delete a do nothing 應此auto ptr的析構函式是這樣子的 auto ptr 二 auto p...
stl智慧型指標auto ptr
感覺auto ptr還是存在一些不足的,效率十分低,而且丟失了一般指標方便常用的操作,如 等,auto ptr只過載了 這幾個操作符,所以使用很不方便。一 說明 int a null delete a do nothing 應此auto ptr的析構函式是這樣子的 auto ptr 二 auto p...