C 智慧型指標 auto ptr

2021-07-16 15:16:41 字數 1471 閱讀 2686

智慧型指標_auto_ptr_vc版本:

擁有權管理和轉移:

當乙個智慧型指標給另乙個智慧型指標初始化的時候,兩個智慧型指標將會同時指向乙個空間,這樣在物件析構的時候,會導致一塊空間釋放多次的問題,所以乙個物件從始至終只能擁有乙個智慧型指標,這樣就保證不會乙個物件多次釋放的問題.

我們讓指標給指標初始化的時候將擁有權進行轉移,即指標1被指標2初始化後,指標1擁有

了管理該物件的權利,會進行析構該物件,而指標2不會對該物件進行析構

#include #include using namespace std;

template class auto_ptr

//智慧型指標初始化的時候,需要將擁有權進行轉移

//將擁有權賦值給新的指標,自身的擁有權進行釋放

auto_ptr(const auto_ptr<_ty> &_y):_owns(_y._owns),_ptr(_y.release())

{} auto_ptr<_ty>& operator=(const auto_ptr<_ty> &_y)

else if(_y.owns) //p2和p1指向相同,判斷p1是否有擁有權,有則將擁有權轉移

_owns = true;

_ptr = _y.release(); //將pa1的擁有權進行釋放,並將指標賦值給pa2

} return *this;

} ~auto_ptr()

public:

_ty& operator*()const //*p

_ty* operator->()const //p->

_ty* release()const //將擁有權釋放,並返回指標

private:

bool _owns;

_ty *_ptr;

};class test

{public:

void fun()const

{ cout<<"this is test fun()"cout<<*pacout<<*pa1pa2 = pa;

cout<<*pa2<

pa2 = pa1 的時候:

1.pa2 無指向  : 將pa1的指標給pa2賦值,再將pa1將擁有權進行轉移;

2.pa2 有指向不同於pa1的物件 : 將pa2的指向進行析構,再將pa1的指標給pa2賦值,將pa1的擁有權轉移;

3.pa2 有指向和pa1相同的物件 : 判斷pa1是否有擁有權,有則將pa1的擁有權轉移給pa2。

但vc版的auot_ptr也有一些問題,就是將擁有權轉移後,除了不能夠對其多次析構外,還可以對其進行操作,這就不好了,你都已經分手了,還不放手。

在vs版本上對擁有權有更好的管理。

C 智慧型指標(auto ptr)

智慧型指標 在c 中使用堆記憶體是非常頻繁的操作,堆記憶體的申請和釋放都由程式設計師自己管理。使用普通指標,容易造成堆記憶體洩露,二次釋放等問題,使用智慧型指標能更好的管理堆記憶體。c 11中引入了智慧型指標的概念,方便管理堆記憶體。棧 堆區別 棧 系統開闢 系統釋放 堆 手動開闢 手動釋放 設計 ...

C 智慧型指標auto ptr

template class auto ptr 建構函式 templateinline auto ptr auto ptr t p pointee p 拷貝建構函式 templateinline auto ptr auto ptr auto ptr rhs pointee rhs.release t...

C 智慧型指標 auto ptr

auto ptr是智慧型指引,可以自我銷毀而不像new出來的物件一樣需要呼叫delete銷毀。auto ptr賦值用引起所有權的交接,作為函式引數或返回值都會引起所有權的交接。auto ptr必須顯示初始化 auto ptrp new int 43 ok auto ptrp new int 43 e...