智慧型指標詳解

2021-09-26 11:11:16 字數 1612 閱讀 8202

智慧型指標就是用乙個類來封裝乙個指標

主要負責自動的來釋放記憶體,防止發生記憶體洩漏

智慧型指標中儲存的是指向動態物件的指標,用於動態物件生存週期的控制,能夠確保自動且正確的銷毀動態物件,防止記憶體洩漏。智慧型指標的主要作用就是利用棧智慧型指標離開作用域的時候呼叫析構函式釋放資源。

下面我們介紹四類智慧型指標

auto_ptr是c++98引入的,但是現在已經基本上棄用了,雖然它可以像其他的智慧型指標一樣自動釋放記憶體,但是它的缺陷還是太明顯了。auto_ptr物件p賦值給另乙個物件q時,p就失去了對它的記憶體的訪問許可權,所以說不能用多個auto_ptr物件指向同一片記憶體,auto_ptr的訪問權唯一。這就是auto_ptr最大的缺點。

下面我們用**來看一下auto_ptr的缺點

#include#includeusing namespace std;

int main()

後來在c++11中又引入了三個智慧型指標用來彌補auto_ptr的缺點:uniquep_ptr,wake_ptr,shared_ptr

unique_ptr也被稱為獨佔形智慧型指標,智慧型有乙個指針對指向該物件,也無法通過拷貝構造產生新的智慧型指標物件,也無法用賦值操作產生新的智慧型指標物件。但是,他的物件所有權可以轉移。

#include#includeusing namespace std;

int main()

為什麼說shared_ptr是共享的智慧型指標?因為它可以用多個指標指向同乙個物件,當最後乙個指標被銷毀時,該物件被釋放。

原理:每個shared_ptr的拷貝的都是指向相同的記憶體,採用引用計數器的方法,允許多個智慧型指標指向同乙個物件,沒建立乙個指標指向該物件時,智慧型指標內部的引用技術+1,每當少乙個智慧型指標指向物件時,引用計數會-1,當計數為0的時候,智慧型指標會自動的釋放動態分配的記憶體。

但是,shared_ptr有乙個很大的缺陷,交叉引用

#include#includeusing namespace std;

class b;

class a

~a() };

class b

~b() };

int main()

這個程式執行的結果是a::a(),b::b(),兩個類都沒有呼叫析構函式,所以造成了記憶體洩漏。

當我們列印引用計數的時候發現都是1,這就說明編譯器認為還有指標指向這兩個記憶體,不能釋放,這裡就造成了記憶體洩漏。p1指向a類,b類中有乙個指標a也指向a類,所以a類的引用計數為2,b類一樣也是2,當主程式返回之後引用計數變為1,因為不為0,所以不能釋放記憶體,所以造成洩漏。解決的方法就是弱智能指標。

weak_ptr它指向乙個shared_ptr管理的物件而不影響物件的生命週期,起輔助作用。它只引用,不計數。一塊記憶體被shared_ptr和weak_ptr同時引用,當shared_ptr析構之後,不管有沒有weak_ptr引用該記憶體,都會被釋放。

所以在使用強弱智慧型指標的時候遵循乙個原則就好,在初始化對像的時候用強智慧型指標shared_ptr,其餘的地方全部用弱智能指標。

C Boost智慧型指標詳解

一 簡介 由於 c 語言沒有自動記憶體 機制,程式設計師每次 new 出來的記憶體都要手動 delete。程式設計師忘記 delete,流程太複雜,最終導致沒有 delete,異常導致程式過早退出,沒有執行delete 的情況並不罕見。用智慧型指標便可以有效緩解這類問題,本文主要講解參見的智慧型指標...

C 智慧型指標詳解

自c 11起,c 標準提供兩大型別的智慧型指標 1.class shared ptr實現共享式擁有 shared ownership 概念。多個智慧型指標可以指向相同物件,該物件和其相關資源會在 最後乙個引用 reference 被銷毀 時候釋放。為了在結構複雜的情境中執行上述工作,標準庫提供了we...

智慧型指標 unique ptr 詳解

簡單地說,c 智慧型指標是包含過載運算子的類,其行為像常規指標,但智慧型指標能夠及時 妥善地銷毀動態分配的資料,並實現了明確的物件生命週期,因此更有價值。c 在記憶體分配 釋放和管理方面向程式猿提供了全面的靈活性。但是這種靈活性是把雙刃劍,一方面它使c 成為一種功能強大的語言,另一方面它讓程式猿能夠...