auto ptr的VC版本原始碼剖析

2022-07-03 16:27:11 字數 1444 閱讀 2199

auto_ptr是當前c++標準庫(stl)中提供的一種智慧型指標,包含於標頭檔案 #include。auto_ptr 能夠方便的管理單個堆記憶體物件,在你不用的時候自動幫你釋放記憶體。

乙個版本的auto_ptr是linux和vs中使用的,另乙個是vc版本的,下面是vc版本的auto_ptr的源**剖析:

1 template

2class

auto_ptr37

8 ~auto_ptr() //析構9

14}1516 auto_ptr(const auto_ptr<_ty> &_y):_owns(_y._owns),_ptr(_y.release()) //

拷貝構造

17{}

1819 auto_ptr<_ty>& operator=(const auto_ptr<_ty> &_y) //

拷貝賦值

2030 _owns = _y._owns; //

將pa1的擁有許可權轉移到pa231}

32else

if(_y._owns) //

如果pa1和pa2指向位址相同,判斷pa1是否有擁有權

3336 _ptr = _y.release(); //

將pa1擁有權釋放,並將pa1指標賦值給pa237}

38return *this; //

返回pa239}

4041

42 _ty& operator*() const

//過載*

4346

47 _ty* operator->() const

//過載->

4851

52 _ty* release() const

//將擁有許可權釋放,並返回指標

//常物件只能呼叫常方法所以要加const

5357

58private:59

bool _owns; //

加了mutable關鍵字,此變數就不受const的限制,但是不安全

60 _ty *_ptr;

61 };

當pa2 = pa1時 :

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

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

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

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

如果兩個指標指向乙個空間但是都沒有擁有權,最後需要用delete釋放。

auto ptr的VC版本原始碼剖析

auto ptr是當前c 標準庫 stl 中提供的一種智慧型指標,包含於標頭檔案 include。auto ptr 能夠方便的管理單個堆記憶體物件,在你不用的時候自動幫你釋放記憶體。乙個版本的auto ptr是linux和vs中使用的,另乙個是vc版本的,下面是vc版本的auto ptr的源 剖析 ...

KCP C 版本 原始碼解析

kcp send 對使用者的資料根據mss值進行分片,然後將分片後的資料放入snd queue。kcp flush,每次被呼叫的時候遍歷出隊snd queue 條件為snd nxt snd una cwnd 對每個seg的sn與una編號,cmd ikcp cmd push,進行初始化後,放入snd...

auto prt的VS版本原始碼剖析

通過對vc版本的auto ptr的源 得知vc版本還有一點小缺陷,又對vs版本的auto ptr做了一些剖析,具體 和注釋如下 1 假設全域性pa2都是用pa1來構造2 如 pa2 pa1 pa2 pa1 34 template auto ptr類宣告 5class auto ptr 67 temp...