智慧型指標是乙個行為類似指標的物件。我們在使用堆記憶體時,都需要及時地進行釋放,避免造成記憶體洩漏。但我們偶爾也會忘記將其釋放掉,從而造成記憶體洩漏。並且,在釋放的時候,我們可能對某乙個指標進行了重複釋放,導致程式崩潰的問題。為了能夠解決這些問題,從而有了智慧型指標的設計。
智慧型指標一共有四種,分別是shared_ptr、unique_ptr、weak_ptr、auto_ptr。auto_ptr是c++98提供的解決方案,c++11這個版本提供了shared_ptr、unique_ptr、weak_ptr三種智慧型指標,在使用的時候需要包含標頭檔案memory。智慧型指標在建立的物件過期的時候,析構函式會自動呼叫delete來釋放記憶體。在用到智慧型指標的過程中需要注意到由於智慧型指標是乙個物件,不是乙個指標,因此不能使用普通指標構造智慧型指標。
1.shared_ptr智慧型指標
shared_ptr使用了引用計數,在進行拷貝和賦值的時候,會使得指標指向相同的記憶體,使得引用計數+1,進行析構或者重新賦值(重新賦值使得指標的指向發生改變,不再指向原來的記憶體位址)的時候,引用計數-1。直到引用計數為0的時候,才會對記憶體進行釋放。根據這些特點,我們可以自己模擬實現乙個簡單的shared_ptr智慧型指標。
#include #include #include using namespace std;
templateclass smartptr
else
}smartptr(const smartptr&src)
~smartptr() }
t& operator*()
t* operator->() };
templatemapsmartptr::_num = map();
2.weak_ptr智慧型指標
在實際使用shared_ptr智慧型指標的時候,可能會出現迴圈引用的情況,並且shared_ptr是乙個強引用,強智慧型指標的交叉引用,會導致在釋放的時候,由於指標互相指向對方,導致無法被釋放掉,計數器始終停留在1。為了解決這個問題,而實現了weak_ptr弱智能指標。
weak_ptr是乙個弱引用,它並不會引起引用計數的變化。弱智能指標無法直接投入使用,如果需要使用的話,就轉為強智慧型指標。這時候就要用到lock()。
弱智能指標在轉化為強智慧型指標時,有成功和失敗兩種情況。失敗的情況是由於原來的已經被釋放,轉化為強智慧型指標之後,無法在map裡找到其對應的強智慧型指標,所以導致失敗。
shared ptr(智慧型指標)
只要將 new 運算子返回的指標 p 交給乙個 shared ptr 物件 託管 就不必擔心在 寫delete p語句 實際上根本不需要編寫這條語句,託管 p 的 shared ptr 物件在消亡時會自動執行delete p。而且,該 shared ptr 物件能像指標 p 樣使用,即假設託管 p ...
智慧型指標shared ptr
shared ptr在脫離自己的作用域時候,會自動呼叫析構函式。作用域包含 塊 被呼叫函式 main函式等。include include include include using namespace std class a a int n private int n string str voi...
Boost智慧型指標 shared ptr
boost scoped ptr雖然簡單易用,但它不能共享所有權的特性卻大大限制了其使用範圍,而boost shared ptr可以解決這一侷限。顧名思義,boost shared ptr是可以共享所有權的智慧型指標,首先讓我們通過乙個例子看看它的基本用法 該程式的輸出結果如下 the sample...