智慧型指標 強弱智慧型指標

2021-09-12 15:47:30 字數 2535 閱讀 1490

在平時編寫**的時候經常會用到new來開闢空間,而我們開闢出來的空間必須得手動去delete他,但是如果程式設計師忘記去手動釋放那邊會出現乙個麻煩的問題,記憶體洩漏!!或者是一塊記憶體被多個函式同時使用時,如果其中乙個函式不知道還有其他人也在使用這塊記憶體而釋放掉的話同樣也會引起程式的崩潰。

引起記憶體洩漏一般的後果是很嚴重的,而且也是最讓人頭疼的乙個問題,根據上面的問題,由此產生了智慧型指標的引入。智慧型指標很好的解決了這種問題。指標指標又有很多種包括:std::auto_ptr、boost::scoped_ptr、boost::shared_ptr、boost::scoped_array、boost::shared_array、boost::weak_ptr、boost:: intrusive_ptr。而這篇文章主要用boost::shared_ptr和boost::weak_ptr這兩種常用的智慧型指標來分析。

shared_ptr ,強智慧型指標,需要包含標頭檔案標頭檔案。他是專門用於共享所有權的,其在內部使用了引用計數。他是一種強引用,當有人需要用這個指標時他的引用計數都會加一,每析構一次引用計數就會減一,當引用計數為零時便會預設呼叫delete來釋放也可以是自己的函式來釋放。這樣做的好處在於減輕了程式設計師手動釋放記憶體的負擔。之前,為了處理程式中的異常情況,往往需要將指標手動封裝到類中,通過析構函式來釋放動態分配的記憶體;現在這一過程就可以交由shared_ptr完成了。

#include#includeusing namespace std;

templateclass smartptr

else

}smartptr(const smartptr& src)

~smartptr() }

t& operator*()

t* operator->() };

templatemapsmartptr::_num = map();

使用shared_ptr智慧型指標不僅可以解決記憶體洩漏的問題,巧妙的處理了當多個地方需要共享一塊記憶體時這塊記憶體的合理使用。因為他有引用計數的機制,這就能使他在多個地方同時使用這塊記憶體時知道到底有幾個人還在使用,當沒有人在使用的時候他才會釋放這塊記憶體。不會有一些地方錯誤的釋放掉了記憶體導致其他地方正常使用這塊記憶體時出現錯誤。

雖然shared_ptr指標看似已經和完美了可以解決大部分的問題,但是還是有乙個問題是shared_ptr指標不能解決的,那就是交叉引用的問題

class b;

class a

~a()

shared_ptr_ptrb;

};class b

~b()

shared_ptr_ptra;

};int main()

在這裡強智慧型指標ptra指向物件a,而b類中有強智慧型指標_ptrb指向a,則ptra的引用計數為二,同理強智慧型指標ptrb指向物件b,而a類中有強智慧型指標_ptra指向b,則ptrb的引用計數為二

上面的程式執行結果為:

這裡並沒用呼叫兩個類中的析構函式,因為這兩個智慧型指標的引用計數開始時為二,當主函式結束時兩個智慧型指標的引用計數都會減一,但是並沒有到零所以並不會呼叫析構函式。這裡便會導致記憶體沒有被釋放,從而導致記憶體洩漏。

根據這種問題便出現了弱智能指標的引入,

weak_ptr是為了配合shared_ptr而引入的一種智慧型指標,它更像是shared_ptr的乙個助手而不是智慧型指標,因為它不具有普通指標的行為,沒有過載operator*和->,它的最大作用在於協助shared_ptr工作,像旁觀者那樣觀測資源的使用情況.

weak_ptr被設計為與shared_ptr共同工作,可以從乙個shared_ptr或者另乙個weak_ptr物件構造,獲得資源的觀測權。但weak_ptr沒有共享資源,它的構造不會引起指標引用計數的增加。這種弱引用它並不對物件的記憶體進行管理,在功能上類似於普通指標。當shared_ptr析構時不用管weak_ptr是否引用了,所以weak_ptr指向的記憶體並不能確保是有效的,在使用時首先要判斷weak_ptr是否有效。

在引入weak_ptr後上面的程式可以這樣改,採用強弱指標並用的方式來解決問題。

class b;

class a

~a()

weak_ptr_ptrb;

};class b

~b()

weak_ptr_ptra;

};int main()

還是之前的那個問題,只不過把類中的強指標shared_ptr改為弱指標weak_ptr。

執行的結果為:

經過上面的改動a和b的引用計數都會為一,當程式結束時兩個的引用計數減一變為零,這樣便會呼叫析構函式。

最後在強若指標使用時為了避免智慧型指標迴圈引用造成的記憶體洩露情況,一定要建立物件用強智慧型指標,其他地方只能用持有資源的弱智能指標。

C 弱智能指標(weak ptr)

弱智能指標 一般結合強智慧型指標使用,它指向乙個 shared ptr 管理的物件.進行該物件的記憶體管理的是強引用的 shared ptr.weak ptr只是提供了對管理物件的乙個訪問手段 weak ptr 設計的目的是為配合 shared ptr 而引入的一種智慧型指標來協助 shared p...

C 弱智能指標weak ptr詳解

在最早有介紹關於智慧型指標的博文,但並未深入 弱智能指標的存在,這是簡單提到它是來配合強智慧型指標一起使用,且不可以單獨使用,所以對於弱智能指標它的作用就是解決強智慧型指標之間的相互引用而存在的。那,本文主要介紹關於弱智能指標weak ptr的一些東西 關於 weak ptr,weak ptr是伴隨...

C 強弱智慧型指標引起的執行緒安全問題

include include include using namespace std class a a void funa void hander01 a p int main 執行結果 a在析構完成之後還可以呼叫a的方法,這個操作是極其不安全的乙個操作的,所以我們可以使用強弱智慧型指標來使得操...