智慧型指標的簡單剖析和實現

2021-07-12 08:10:28 字數 2240 閱讀 8141

在c語言中我們用指標來進行記憶體管理,這也是c語言的強大之處。然而,也正是指標的存在使得c語言變得令人懊惱,記憶體洩漏、垂懸指標等等問題。強大的c++則採用智慧型指標(smart_ptr)來處理這個問題.

好了,什麼是智慧型指標呢?智慧型指標的行為類似常規指標,重要的區別是它負責自動釋放所指向的物件。這樣以防止記憶體洩漏。

智慧型指標都有哪些種類呢?

通過上述**可以看出有如此多的智慧型指標,c11標準庫已經引進unique_ptr/shared_ptr/weak_ptr供我們使用。

下面來簡單談談這些指標的原理和實現。

first——>auto ptr

auto ptr的實現原理主要是管理權的轉移。它是所擁有的物件的唯一擁有者,也就是乙個物件只有乙個擁有者。

**實現:

template class autoptr

~autoptr() }

autoptr(autoptr& ap)

autoptroperator=(autoptr& ap)

return *this;

} t& operator*()

t* operator->()

private:

t* _ptr;

};

通過**我們可以看出由於auto ptr指標唯一性,即乙個物件只能有乙個auto ptr指標所指向它。因此,當auto ptr以傳值方式被作為引數傳遞給某函式時,這時物件的原來擁有者就放棄了物件的擁有權,把它轉移到被呼叫函式中的引數上,如果函式不再將擁有權傳遞出去,由於形參的作用域僅僅為函式內部,當函式退出時,它所指向的物件將被銷毀。當函式返回乙個auto ptr時,其擁有權又被轉移到了呼叫端。因此,我們盡量不要使用auto ptr傳參,或者引用傳遞。此外,auto ptr 還不能作為容器的成員,c++標準明確禁止這樣做。

second——>scoped ptr

scoped ptr與auto ptr類似,它實現的原理則是防拷貝,也就是它不能轉移管理權,所以不能被賦值或者拷貝構造。那麼,我們可以將拷貝構造和賦值運算子過載函式只宣告不實現,並將其宣告為保護,那麼也就防止了別人在類外實現它。

**實現:

template class scopedptr

~scopedptr() }

t& operator*()

t* operator->()

protected:

t* _ptr;

scopedptr(scopedptr& sp);

scopedptr& operator=(scopedptr& sp);

};

通過**可以看出scoped ptr 的實現十分的簡單粗暴,動態分配物件的生命週期限制在特定的作用域,採用scoped ptr可以有作用域保護,使用起來也優於auto ptr。

third——>shared ptr

shared ptr顧名思義就是共享,所以也就是說多個指標可以指向同乙個記憶體,它所採用的是引用計數的原理,也就是引進了乙個計數器shared_count,用來表示當前有多少個智慧型指標物件共享指標指向的記憶體。因此shared_ptr可以做為stl容器的元素。析構函式中不是直接釋放指標對應的內塊,shared_count大於1則不釋放記憶體只是將引用計數減1,只是計數等於1時釋放記憶體。這樣避免了一塊記憶體被多次析構的問題。

**實現:

template class sharedptr

~sharedptr()

sharedptr(sharedptr& sp)

:_ptr(sp._ptr)

,_pcount(sp._pcount)

sharedptr& operator=(sharedptr& sp)

}t& operator*()

t* operator->()

long usecount()

t* getptr()

protected:

t* _ptr;

long *_pcount;

void _release() }

};

由上述**可知,我們在拷貝和賦值也會將引用計數進行遞增,而實現也只是一般的複製。

動態物件的正確釋放是程式設計中最容易出錯的地方,利用智慧型指標可以更安全的使用動態物件,使得我們的程式更高效、安全。

本文出自 「七月朔風」 部落格,請務必保留此出處

智慧型指標share ptr 簡單剖析

本文 話不多說直接上碼!shared ptr的簡單實現版本 基於引用記數的智慧型指標 namespace boost 空間庫boost templateshared ptr y py shared ptr constshared ptr r px r.px templateshared ptr co...

智慧型指標剖析

c 中,動態記憶體的開闢需要使用者自己管理,在使用完成之後,必須由使用者自己來釋放空間,當然,大部分程式設計師都會說,我肯定會記得釋放的,然而,對於這個問題,我們還是防不勝防,一不小心就會造成記憶體洩露。在這樣的情況下,我們為何不把開闢的空間交給智慧型指標來管理呢?這樣即高效又不容易出問題。c 中,...

智慧型指標剖析

c 11中引入了智慧型指標包括auto ptr shared ptr weak ptr unique ptr。我們在寫c 程式時,動態記憶體需要自己維護,動態開闢的空間,在出函式作用域或者程式正常退出前必須釋放,否則會造成記憶體洩露。void fun 在do something時,如果出現了異常或者...