正確使用std auto ptr

2021-07-08 13:43:36 字數 3213 閱讀 4336

1, auto_ptr類

auto_ptr是乙個模板類,定義如下:

template

classauto_ptr ;

它儲存的是乙個指向type的指標。

顧名思義,auto_ptr是一種智慧型指標,它包含乙個動態分配記憶體的指標,並在它生命週期結束的時候,銷毀包含的指標所指向的記憶體。

例1:

voidf()

這樣的**很常見,但它有可能造成記憶體洩露。首先你用了new,你就要記得用delete,但即使你記住了用delete,還是會出問題。如果f()在執行delete pt之前,就丟擲了異常,函式返回了。那麼這個分配的物件就沒被刪除。

使用auto_ptr,很優雅的解決了這些問題。

例2:

voidf()

現在的**,不會洩露type型別的物件。不管是函式正常結束,還是丟擲異常結束,都會呼叫pt的析構函式,從而刪除分配的物件。

2, auto_ptr建構函式

建構函式1:

explicit 

auto_ptr(type* _ptr

= 0)throw( );

auto_ptr<int> pt;                //包含乙個int*的指標,並初始化為null

auto_ptr<int> pt(new int(123));  //包含乙個int*的指標,並初始化為123的位址

auto_ptr<int> pt =new int(123); //error!建構函式宣告為explicit

建構函式2:

auto_ptr(auto_ptr& _right)throw( );

int*

ptr =new int();

auto_ptr<int> pt1(ptr); //建構函式1

auto_ptr<int> pt2(pt1); //將pt1的使用權轉給pt2,注意pt1指向null了

//pt1呼叫了本身的release()函式,將內部指標位址傳給pt2

建構函式3:

template<typenameother>       

auto_ptr(auto_ptr& _right)throw( );

宣告這樣乙個拷貝建構函式的目的,就是為了派生類指標能轉換成基類的指標。

例:

classbase ;

classderived :publicbase ;

auto_ptrpderived(newderived);

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

std auto ptr智慧型指標使用

此篇博文記錄編碼過程中遇到的有關智慧型指標std auto ptr的使用方法,由於是記錄使用過程中遇到的方法所以不會將該智慧型指標的全部方法簡紹清楚,有關std auto ptr的詳細教程請參考相應的教程。1 reset pam 方法 使用pam重置智慧型指標,如 std auto ptrmessa...

智慧型指標std auto ptr

std auto ptr 對於編譯器來說,智慧型指標實質是乙個棧物件,而並非指標型別。智慧型指標通過建構函式獲取堆記憶體的管理所有權,而在其生命期結束時,再通過析構函式釋放由它所管理的堆記憶體。所有智慧型指標都過載了 operator 操作符,直接返回物件的引用,用以操作物件。訪問智慧型指標原來的方...

3 智慧型指標std auto ptr

std auto ptr 對於編譯器來說,智慧型指標實質是乙個棧物件,而並非指標型別。智慧型指標通過建構函式獲取堆記憶體的管理所有權,而在其生命期結束時,再通過析構函式釋放由它所管理的堆記憶體。所有智慧型指標都過載了 operator 操作符,直接返回物件的引用,用以操作物件。訪問智慧型指標原來的方...