編寫乙個智慧型指標類

2021-07-04 23:33:32 字數 1469 閱讀 5434

比起一般指標,智慧型指標會自動地管理記憶體(釋放不需要的記憶體),而不需要程式設計師去操心。 它能避免迷途指標(dangling pointers),記憶體洩漏(memory leaks), 分配失敗等情況的發生。智慧型指標需要為所有例項維護乙個引用計數, 這樣才能在恰當的時刻(引用計數為0時)將記憶體釋放。

#include 

#include

using

namespace

std;

template

<

typename

t>

class

smartpointer

smartpointer

(smartpointer

<

t>

&sptr

)smartpointer

<

t>&

operator=(

smartpointer

<

t>

&sptr

)ref

=sptr

.ref

;ref_count

=sptr

.ref_count

;++*

ref_count;}

return

*this;}

~smartpointer()}

tgetvalue

()private

:void

clear

()protected:t

*ref

;unsigned

*ref_count;};

intmain

()

上述**有一點值得注意一下,原書在賦值函式中, 並沒有檢查原指標的引用計數是否已經減為0,然後去釋放原指標所指向的記憶體。 也就是原書的**有可能導致記憶體洩漏。正確的做法應該是在把指標指向新的位址前, 將原來指向的引用計數減1,如果為0,說明這個指標在指向新的位址後, 原來指向的記憶體將不再有指標指向它。那麼我們就要把它釋放, 否則記憶體就會在你眼皮底下洩漏的哦。

上述**main函式中,sp2 = spa這一句如果注釋掉,我們得到的輸出是:

destructor clear

destructor clear

說明記憶體的清理都是在main函式退出呼叫析構函式時。如果我們沒有注釋掉那行**, 輸出是:

operator= clear

destructor clear

說明當sp2指向新的記憶體後,原來的記憶體由於沒有指標指向它而被釋放掉。 另一塊記憶體則是在main函式退出時釋放的。

如果像ctci書上所寫,當sp2 = spa這一句沒有注釋掉時,輸出是:

destructor clear
也就是只釋放了一塊記憶體(ip1指向的記憶體),另一塊由於沒有指標指向它, 而又不及時清理,結果洩漏了。

智慧型指標的乙個bug

先show乙個例項 class father father virtual void fun class mother mother virtual void test int a class son publicfather public mother son void fun int tmain...

自己實現乙個智慧型指標

要實現乙個智慧型指標主要實現下面幾個函式 1 建構函式 2 拷貝建構函式 3 析構函式 4 賦值運算子函式 5 獲取引用計數函式 重點 1 構造,拷貝構造 1 2 析構函式會使引用計數 1.3 賦值運算子會使之前的引用計數 1。使新賦值過來的引用計數 1 include template class...

智慧型指標(一)

c 程式設計中使用堆記憶體是非常頻繁的操作,堆記憶體的申請和釋放都由程式設計師自己管理。管理是麻煩點 e.g.手動釋放等 但無傷大雅,勉強可以接受 但要命的是,容易出問題 為了解決該問題,c 11 引入智慧型指標概念使記憶體管理變得更為方便,且不易出錯 智慧型指標包含在標頭檔案中,包括 shared...