智慧型指標_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...