C 智慧型指標原理

2021-09-26 08:23:09 字數 2063 閱讀 6163

1.c++智慧型指標

2.c++智慧型指標簡單剖析

3.智慧型指標 auto_ptr 詳解

4.c++智慧型指標詳解

5.請你介紹一下c++的智慧型指標——牛客網

在c++程式裡,使用new關鍵字開闢的記憶體必須被手動delete掉,不然就會導致記憶體的洩漏,但是,當程式非常冗長,你能保證自己每乙個手動開闢的記憶體塊都釋放了嗎?在delete之前,倘若程式因為異常跳轉後,你還能保證記憶體被釋放嗎?為了解決這種因為遺忘或者異常處理而導致記憶體洩漏的問題,我們就要用智慧型指標。

智慧型指標運用了一種叫做raii的技術,即利用物件生命週期來控制程式資源的技術,這中技術的思想就是在構建物件時獲取我們資源的指標,接著控制對資源的訪問使之在物件的生命週期內一直保持有效,在物件析構時釋放指標對應的記憶體塊。這樣,記憶體塊的管理與釋放就完全交給了乙個物件,這樣做的好處有兩點:

不需要顯示的釋放資源

物件所需的資源在其生命週期內始終有效。

在智慧型指標的發展歷程中,c++不斷推出了各種各樣的智慧型指標。但在賦值/拷貝過程,但他們都個有缺陷,直到今日,shared_ptr才算一種成熟的智慧型指標,下面來分別介紹這幾種指標。

1.auto_ptr

評價:最早出現的智慧型指標,但是效能也是最差的。

原理:在拷貝 / 賦值過程中,直接剝奪原物件對記憶體的控制權,轉交給新物件,然後再將原物件指標置為nullptr。這種做法也叫管理權轉移。他的缺點不言而喻,當我們再次去訪問原物件時,程式就會報錯,所以auto_ptr可以說實現的不好,很多企業在其庫內也是要求不准使用auto_ptr。

2.unique_ptr

評價:在c++11中推出的智慧型指標,解決了auto_ptr的部分問題。

原理:直接把拷貝構造/賦值函式弄成delete,即將這兩個函式定義成已刪除的函式,任何試圖呼叫它的行為將產生編譯期錯誤。是c++11標準的內容。c++的做法是將這兩個函式設為私有,且只宣告不實現。

這種智慧型指標比起auto_ptr要好上不少,且實現簡單。但是遇到要拷貝構造 / 賦值的情景就會啞火,所以只能算中規中矩。

3.shared_ptr

評價:shared_ptr完善了前兩種的不足,既不會直接剝奪原物件對記憶體的控制權,也允許進行拷貝構造和賦值,這都源自於他引入了乙個新的標誌——引用計數。

原理:是通過引用計數的方式來實現多個shared_ptr物件之間共享資源。shared_ptr在其內部,給每個資源都維護了著乙份計數,用來記錄該份資源被幾個物件共享。在物件被銷毀時(也就是析構函式呼叫),就說明自己不使用該資源了,物件的引用計數減一。如果引用計數是0,就說明自己是最後乙個使用該資源的物件,必須釋放該資源;如果不是0,就說明除了自己還有其他物件在使用該份資源,不能釋放該資源,否則其他物件就成野指標了。

4.weak_ptr

問題:shared_ptr所導致的迴圈引用的問題:

當前的shared_ptr已經能解決絕大多數的問題了,但還是有一點點的瑕疵。就是在迴圈引用的時候還會造成記憶體洩漏。

解決方法:c++庫為了解決這個問題,專門定義了乙個叫做weak_ptr的東西,專門用於輔助shared_ptr來解決引用計數的問題。那他是怎麼解決這麼問題的呢?當shared_ptr內部要監視其他的shared_ptr物件時,型別就採用weak_ptr。這種weak_ptr在指向被監視的shared_ptr後,並不會使被監視的引用計數增加,且當被監視的物件析構後就自動失效。

然後它就什麼都不管光是個刪 , 也就是這裡的cur和next在析構的時候 , 不用引用計數減一 , 直接刪除結點就好。這樣也就間接地解決了迴圈引用的問題,當然week_ptr指標的功能不是只有這乙個。但是現在我們只要知道它可以解決迴圈引用就好。

補充:智慧型指標是執行緒安全的嗎?

最後總結一下我們學過的這幾種智慧型指標

不要使用auto_ptr,因為他的缺陷導致我們拷貝構造/賦值的時候有很大的麻煩;

在不需要拷貝構造/賦值的時候,可以使用unique_ptr;

有拷貝構造/賦值的情況,推薦使用shared_ptr;

類內有訪問其他shared_ptr物件時,指標型別設為weak_ptr,可以不改變其他shared_ptr物件的引用計數;

**中盡量不用delete關鍵字,因為我們的記憶體的管理與釋放全權交給物件處理;

C 智慧型指標原理

智慧型指標 smart pointer 是儲存指向動態分配 堆 物件指標的類,用於生存期控制,能夠確保自動正確的銷毀動態分配的物件,防止記憶體洩露。它的一種通用實現技術是使用引用計數 reference count 智慧型指標類將乙個計數器與類指向的物件相關聯,引用計數跟蹤該類有多少個物件共享同一指...

C 智慧型指標及其原理

智慧型指標介紹 智慧型指標 raii 是利用物件的生命週期來管理資源的技術。raii,resource acquisition is initialization 顧名思義,就是在初始化物件的時候獲取資源,在這個物件進行析構時會幫我們釋放資源,這樣做的好處有很多 不需要顯示的釋放資源 可以避免因為沒...

智慧型指標原理及C 實現

智慧型指標是乙個類,在類的建構函式中傳入乙個普通指標,析構函式釋放指標。引入智慧型指標是為了更好的管理記憶體,防止記憶體洩漏等問題。實現方法 採用引用計數的方法。智慧型指標將乙個計數器與類指向的物件相關聯,引用計數跟蹤共有多少個類物件共享同一指標。其遵循以下規則 1 每次建立類的新物件時,初始化指標...