用c 簡單實現智慧型指標

2021-06-13 14:48:15 字數 2615 閱讀 9048

用c++簡單實現智慧型指標

什麼是智慧型指標?答案相當簡單;智慧型指標是聰明的普通指標。這是什麼意思?實際上,智慧型指標是一些物件,表現出普通指標的功能但是比普通指標多做了一些事情。這些物件像普通指標一樣靈活,並且管理物件有自己的優點(比如構造器和自動析構)。智慧型指標解決了普通指標的一些問題。

普通指標的問題。

我們使用c++語言中的指標,最常見的問題是什麼?記憶體管理吧,請看下面的**:

char* pname  = new char[1024];

…setname(pname);……

if(null != pname)

好多次我們都會忘記釋放pnme,並且管理釋放這些不會再用到的指標將會是很大的工程。可不可以指標自身進行管理?當然,智慧型指標就可以做到。我們實現乙個智慧型指標,看看智慧型指標如何處理的更好。

下面寫乙個實際例子,先寫乙個叫做person的類。

class person

person(char* pname, int age): pname(pname), age(age)

~person()

void display()

void shout()

};

下面是客戶端**使用person類。

void main()

現在我們來看這段**,每當我建立乙個指標,都要管理釋放它。我要自動的釋放它,智慧型指標可以。因此我們建立乙個sp類來管理person的物件,客戶端的**可以這樣寫:

void main()

void main()

注意:

1,我們建立了乙個sp物件來管理person的指標,當sp物件的作用域結束,會自動析構,它將釋放person的指標。

2,我們可以使用sp的物件p呼叫display()函式,就像person類的物件指標呼叫display()函式,它的行為表現的像person類的物件指標。

智慧型指標介面

智慧型指標表現出指標的行為,所以應該支援如下運算子:

下面實現智慧型指標sp:

class sp

~sp()

person& operator* ()

person* operator-> ()

};

這就是我們智慧型指標,當它的析構函式被呼叫時會釋放person類的物件指標。它也支援類似於指標的操作。

通用的智慧型指標

但是有個問題,我們智慧型控制person類,也就是說每一種型別我們都要實現乙個智慧型指標。我們可以使用模版使它通用。

template < typename t > class sp

~sp()

t& operator* ()

t* operator-> ()

};void main()

我們的智慧型指標這樣就真的智慧型了嗎?驗證下面的**:

void main()

p->display();

}

這樣就會存在乙個問題:p和q關聯到了person類的相同物件指標,當q結束它的作用域時會釋放person類的物件指標,我們用p呼叫display()函式會因為垂懸指標而失敗。我們應該在不使用它的時候再釋放,智慧型指標中引入計數便可解決。

計數器。

下面實現乙個計數器的類rc.

class rc

int release()

};

下面把計數器引入到我們的智慧型指標中:

template < typename t > class sp

sp(t* pvalue) : pdata(pvalue), reference(0)

sp(const sp& sp) : pdata(sp.pdata), reference(sp.reference)

~sp()

}t& operator* ()

t* operator-> ()

sp& operator = (const sp& sp)

// copy the data and reference pointer

// and increment the reference count

pdata = sp.pdata;

reference = sp.reference;

reference->addref();

}return *this;

}};

在看看客戶端的**:

collapse | copy code

void main()

p->display();

// destructor of p will be called here

// and person pointer will be deleted

}

c 實現簡單的智慧型指標

rt,參考了 stl msvc 中shard ptr的實現,基本原理是引用計數,利用ref cnt類來管理記憶體,在shared ptr建立時建立,此後shared ptr僅是在拷貝複製析構的過程中對引用進行修改,個人覺得比較有意思的乙個地方在於通過對ref cnt類多型的應用使得shared pt...

C 智慧型指標實現

1 問題的提出 先看下面的例子 class ctext ctext private int m ptr int funtext 在函式funtext 中,類的兩個物件共用了new出來的指標ptr。當函式執行開始時,呼叫兩次建構函式 退出執行時,呼叫兩次析構函式,而在第一次呼叫時已經delete pt...

智慧型指標實現C

include using namespace std template class shared ptrelse shared ptr const shared ptr ptr shared ptr operator const shared ptr ptr if this ptr this pt...