1, auto_ptr類
auto_ptr是乙個模板類,定義如下:
template class auto_ptr ;
它儲存的是乙個指向type的指標。
顧名思義,auto_ptr是一種智慧型指標,它包含乙個動態分配記憶體的指標,並在它生命週期結束的時候,銷毀包含的指標所指向的記憶體。
例1:
void f()
這樣的**很常見,但它有可能造成記憶體洩露。首先你用了new,你就要記得用delete,但即使你記住了用delete,還是會出問題。如果f()在執行delete pt之前,就丟擲了異常,函式返回了。那麼這個分配的物件就沒被刪除。
使用auto_ptr,很優雅的解決了這些問題。
例2:
void f()
現在的**,不會洩露type型別的物件。不管是函式正常結束,還是丟擲異常結束,都會呼叫pt的析構函式,從而刪除分配的物件。
2, auto_ptr建構函式
建構函式1:
explicitauto_ptr(type*_ptr= 0) throw( );
auto_ptrpt; //包含乙個int*的指標,並初始化為null
auto_ptrpt(new int(123));//包含乙個int*的指標,並初始化為123的位址
auto_ptrpt =new int(123);//error!建構函式宣告為explicit
建構函式2:
auto_ptr(auto_ptr&_right)throw( );
int* ptr =new int();
auto_ptrpt1(ptr); //建構函式1
auto_ptrpt2(pt1);//將pt1的使用權轉給pt2,注意pt1指向null了 //pt1呼叫了本身的release()函式,將內部指標位址傳給pt2
建構函式3:
templateauto_ptr(auto_ptr&_right)throw( );//宣告這樣乙個拷貝建構函式的目的,就是為了派生類指標能轉換成基類的指標。
例:class base ;
class derived :public base ;
auto_ptrpderived(new derived);
auto_ptrpbase(pderived); //讓這樣的**能通過編譯器
其本質是為了讓,auto_ptr類內部的derived*轉換為base*
建構函式4:
auto_ptr(auto_ptr_ref_right)throw( );
//暫略
3, auto_ptr成員函式
成員函式1:
type* get( )const throw( );
獲得包含指標的位址
int* ptr = new int(123);
auto_ptrpt(ptr);
assert(pt.get() == ptr); //相等,指向同一位址
成員函式2:
type* release( )throw( );
返回包含指標的位址,並將包含指標設為null
string* pstr = new string("hello");
auto_ptrpt(pstr);
pt.release(); //不在指向string物件 //此時,pt.get()等於null
delete pstr; //應該手動刪除pstr指向的記憶體塊
成員函式3:
void reset(type* _ptr = 0);
double* pdouble1 = new double(3.14);
double* pdouble2 = new double(1.23);
auto_ptrpt1(pdouble1);
pt1.reset(pdouble2); //將刪除pt1所指向的記憶體塊就是pdouble1指向的那塊 //此時,pt.get()等於pdouble2
cout << *pdouble1; //error,pdouble已經是野指標了。
4, 使用總結
1,auto_ptr儲存的指標應該為null或者指向動態分配的記憶體塊。
2,auto_ptr儲存的指標應該指向單一物件(是new出來的,而不是new出來的)。
3,兩個auto_ptr物件不會同時指向同一塊記憶體塊。要明白2個auto_ptr物件賦值會發生什麼。
4,千萬不要把auto_ptr物件放在容器中。
5,當將auto_ptr作為函式引數時,最好宣告為const auto_ptr&(by const ref).當函式返回值可以簡單的傳值(by value).
auto ptr智慧型指標
1 class auto ptr 這個智慧型指標應該保證,無論在何種情形下,只要自己被摧毀,就一定連帶釋放其所指資源。而由於智慧型指標本身就是區域變數,所以無論是正常退出,還是異常退出,只要函式退出,它就一定會被銷毀。注意 auto ptr不允許使用一般指標慣用的賦值 assign 初始化方式。必須...
智慧型指標 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...