智慧型指標的模擬實現

2021-08-04 06:03:07 字數 2920 閱讀 9547

1.引入

int main()

在上面的**中定義了乙個裸指標p,需要我們手動釋放。如果我們一不小心忘記釋放這個指標或者在釋放這個指標之前,發生一些異常,會造成嚴重的後果(記憶體洩露)。而智慧型指標也致力於解決這種問題,使程式設計師專注於指標的使用而把記憶體管理交給智慧型指標。

普通指標也容易出現指標懸掛問題,當有多個指標指向同乙個物件的時候,如果某乙個指標delete了這個物件,所以這個指標不會對這個物件進行操作,那麼其他指向這個物件的指標呢?還在等待已經被刪除的基礎物件並隨時準備對它進行操作。於是懸垂指標就形成了,程式崩潰也「指日可待」。

int main()

輸出結果

222

-572662307

輸出的結果*p2的結果並不是期待中2,因為2早已經被刪除了。

智慧型指標

智慧型指標是乙個類,它把普通指標封裝起來,能實現和普通指標同樣的功能。不同的是智慧型指標能夠對記憶體進行自動管理,利用類物件出了作用域會呼叫析構函式,把對指標的釋放寫在析構函式中,避免出現懸掛指標的情況。

智慧型指標(smart pointer)是儲存指向動態分配(堆)物件指標的類,用於生存期控制,能夠確保自動正確的銷毀動態分配的物件,防止記憶體洩露。它的一種通用實現技術是使用引用計數(reference count)。智慧型指標類將乙個計數器與類指向的物件相關聯,引用計數跟蹤該類有多少個物件共享同一指標。每次建立類的新物件時,初始化指標並將引用計數置為1;當物件作為另一物件的副本而建立時,拷貝建構函式拷貝指標並增加與之相應的引用計數;對乙個物件進行賦值時,賦值操作符減少左運算元所指物件的引用計數(如果引用計數為減至0,則刪除物件),並增加右運算元所指物件的引用計數;呼叫析構函式時,建構函式減少引用計數(如果引用計數減至0,則刪除基礎物件)。

智慧型指標就是模擬指標動作的類。所有的智慧型指標都會過載 -> 和 * 操作符。智慧型指標還有許多其他功能,比較有用的是自動銷毀。這主要是利用棧物件的有限作用域以及臨時物件(有限作用域實現)析構函式釋放記憶體。當然,智慧型指標還不止這些,還包括複製時可以修改源物件等。智慧型指標根據需求不同,設計也不同(寫時複製,賦值即釋放物件擁有許可權、引用計數等,控制權轉移等)。auto_ptr 即是一種常見的智慧型指標。

智慧型指標的實現(用類模板實現)

class test

~csmartptr()

void relase() const

t& operator*()

const t& operator*()const

t *operator->()

const t *operator->()const

private:

t *_ptr;

};int main()

模擬實現auto_ptr

template

class csmartptr

~csmartptr()

}void relase() const

t& operator*()

const t& operator*()const

t *operator->()

const t *operator->()const

private:

t *_ptr;

bool owns; //標誌位 ,控制乙個資源的訪問許可權

};int main()

帶有引用計數的智慧型指標(方便對資源的管理和釋放)

class cheaptable

//增加引用計數

void addref(void *ptr)}}

//獲取引用計數的

int getref(void *ptr)

return

0; }

private:

cheaptable(){}

static cheaptable mheaptable;

struct node

bool

operator==(const node &src)

void *mpaddr; //標識堆記憶體資源

int mcount; //標識資源的引用計數

};list

mlist;

};cheaptable cheaptable::mheaptable;

template

class csmartptr

}~csmartptr()

}csmartptr(const csmartptr&src)

:mptr(src.mptr)

}csmartptr& operator=(const csmartptr&src)

mptr = src.mptr;

if(mptr != null)

}t& operator*()

const t& operator*()const

t* operator->()

const t* operator->()const

void addref()

void delref()

int getref()

private:

t *mptr;

static cheaptable &mheaptable;

};template

cheaptable& csmartptr::mheaptable = cheaptable::getinstance();

模擬實現智慧型指標

智慧型指標可以用來管理資源,原自構造析構函式 raii 還可以像原生指標一樣使用。auto ptr 管理許可權的轉移。scoped ptr 防拷貝。shared ptr 引用計數解決auto ptr的缺陷。其中shared 自身帶有一定缺陷,迴圈引用,和不可釋放陣列類,檔案類等資源,幸運的是它支援定...

模擬實現智慧型指標SharedPtr

首先我們先來乙個小小的區分三個智慧型指標 1,autoptr 管理權的轉移 嚴重缺陷,盡量不要使用 2,scopedptr 簡單粗暴 防拷貝 只宣告不定義 3,sharedptr 共享,引用計數,功能強大,迴圈引用,但是較為複雜 下面我們來模擬實現一下sharedptr template t cla...

模擬實現boost庫里的智慧型指標

include include using namespace std 模擬實現auto ptr,非常坑爹什麼情況下都不要使用 template class auto ptr auto ptr auto ptr a 拷貝建構函式 auto ptr operator auto ptr a ptr a....