正確使用auto ptr智慧型指標

2021-07-25 16:43:56 字數 3054 閱讀 3995

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