vc版auto ptr智慧型指標實現

2021-10-12 21:59:09 字數 1759 閱讀 1242

#define _crt_secure_no_warnings

#include

#include

//#include

#include

using

namespace std;

template

<

class

_ty>

class

autoptr

// 拷貝建構函式,呼叫_y.release()保證在_ptr成員賦值時擁有權轉移出去

autoptr

(const autoptr<_ty>

&_y)

:_owns

(_y._owns)

,_ptr

(_y.

release()

)// 賦值語句

autoptr<_ty>

&operator=(

const autoptr<_ty>

&_y)

/* 兩個智慧型指標的空間管理物件相同,形如

* int a = new int

* auto_ptrq1(a),q2(a);

* q1 = q2,空間管理物件相同時_ptr空間不釋放

* 只要保證擁有權正確轉移即可

* 這裡還有對_y._owns做判斷,是要保證擁有權不會丟失

* 防止q1的擁有權為真,q2的擁有權為假從而直接賦值後

* 擁有權丟失的情況

*/else

if(_y._owns)

_ptr = _y.

release()

;}return

*this;}

// 過載* 使物件有指標取*的特性

_ty&

operator*(

)const

// 過載-> 使物件有指標 -> 運算的特性

_ty*

operator

->()

const

// 在_ptr成員賦值時保證擁有權轉移出去

_ty*

release()

const

~autoptr()

private

:/* 擁有權,擁有權為真才有資格釋放智慧型指標管理的空間

* 為了防止在拷貝構造或賦值時,同一塊空間被多個智慧型指標物件管理

* 造成同一塊空間被多重釋放,因此要保證智慧型指標在拷貝或賦值時擁有權

* 的正確轉移,即任何時刻只能有乙個智慧型指針對一塊空間有擁有權

在呼叫拷貝構造或重新賦值後,空間管理權雖然發生了轉移,但是仍然能通過智慧型指標改變或訪問其所不具有空間管理權的空間的值

int

*p =

newint(10

);autoptr<

int>

q(p)

; autoptr<

int>

q2(q)

;// 空間管理已發生轉移,交由q2管理

*q =

100;

// q已不具有空間管理權,但是仍能訪問或改變原來空間的值

cout <<

*q << endl;

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