C 基礎(十)智慧型指標之shared ptr

2021-10-12 01:47:47 字數 2785 閱讀 7306

為了一定程度解決手動分配的動態記憶體忘記釋放的問題,c++引入了智慧型指標的概念。並且在c++11中,將智慧型指標進行了優化,更加方便易用。

智慧型指標,顧名思義,實質還是指標,不過它很智慧型,會在合適的時機自己釋放記憶體,無需手動delete。其原理就是引入計數,一旦指向某一塊記憶體的指標數為0,則釋放。

常用的智慧型指標為共享指標shared_ptr和獨佔指標unique_ptr,共享指標可以多個智慧型指標指向同一塊記憶體;而獨佔指標則在某個時刻只能有乙個智慧型指標指向某一塊記憶體。

用智慧型指標,需要包含標頭檔案:#include 。

這篇文章僅介紹共享智慧型指標shared_ptr的使用及注意事項,另一篇文章介紹獨佔智慧型指標unique_ptr的知識。

共享指標的建立,最安全的做法是使用標準庫的std::make_shared函式,具體語法如下:

std::shared_ptr《型別》(引數列表)

智慧型指標是乙個模板。

其中,型別即需要建立的智慧型指標型別,比如int、double或者自定義的類;引數列表可以理解成類的建構函式需要的引數,可以為空,但小括號必須要。

例如,自定義person類,如下:

class person

~person()

void printinfo()

private:

std::string m_strname;

int m_iage;

};

在主函式中建立乙個person類以及int型別的shared_ptr並使用,**如下:

int _tmain(int argc, _tchar* ar**)

執行結果如下:

新增乙個根據名字和年齡,獲取相應智慧型指標的介面,如下:

std::shared_ptrgetperson(const std::string strname, int iage)

主函式修改如下:

int _tmain(int argc, _tchar* ar**)

p1->printinfo();

} system("pause");

return 0;

}

執行結果:

主函式中,p1初始化的是趙雲,接下來一對大括號,p2被初始化為關羽,列印p2,得到的是關羽的資訊;接下來,將p2賦值給p1,此時,p1原本指向的記憶體物件趙雲,沒有任何指標指向它,計數變為了0,所以會自動釋放其記憶體,呼叫析構函式,列印釋放趙雲物件的資訊。賦值結束後,p2的作用域結束,但是因為p1已經指向了物件關羽,所以關於物件的指標計數不為0,記憶體並不會被釋放;列印p1的資訊,依然是關羽。接下來遇到大括號,p1的作用域失效,指向關羽的指標計數變成0,記憶體會被自動釋放,列印了釋放物件關羽的資訊。

shared_ptr指向的記憶體物件,只有當指向它的智慧型指標引用計數為0時,才會自動釋放。

理解這幾行**,基本上就可以理解共享指標自動釋放記憶體的原理。

謹記一點,不要將普通指標賦值給智慧型指標,否則可能會引發很嚴重的後果。

請看下面**:

void process(std::shared_ptrp){}

int _tmain(int argc, _tchar* ar**)

**很簡單,定義了乙個什麼都不做的process函式,接收乙個shared_ptr型別的智慧型指標作為引數。

主函式裡,new乙個普通指標p1,列印p1指向的物件內容;再呼叫process函式並以p1作為引數構建乙個臨時的智慧型指標作為引數傳遞,再列印p1。

結果會是什麼呢?

有些出乎意料,為何會如此?

第一次列印出來20,很簡單,就是p1指向的記憶體內容。第二次列印的是未定義的內容,說明p1成了乙個空懸指標。

問題出在process的呼叫上。我們先用p1作為引數,構建了乙個臨時的share_ptr指標,這沒問題;但是這個臨時的智慧型指標指向的是p1的記憶體物件,當process執行結束,這個臨時的智慧型指標作用域消失,其指向的記憶體引用計數變成0,會自動釋放記憶體,即p1指向的記憶體。此時p1依然有效,但是它的記憶體已經被釋放,p1就成了乙個空懸指標(注意,用if(p1)來判斷p1仍然是有效的)。

可用get獲取智慧型指標中的指標,但一定要注意,千萬不要誤delete這個普通指標。

看如下**:

int _tmain(int argc, _tchar* ar**)

執行結果如下:

這裡用new 的方式初始化了乙個shared_ptr指標,列印內容為7,沒問題。

接著,呼叫shared_ptr的介面get,獲取其內部的指標,賦值給普通指標p;緊接著,delete p,將普通指標釋放。此時,pshare的指向的記憶體也被釋放了,用if判斷,pshare本身依然有效;嘗試列印其中內容,未定義。

共享指標的使用比較簡單,就介紹這麼多。

c 基礎 智慧型指標

設計原理 將基本型別指標封裝為類物件指標 這個類肯定是個模板,以適應不同基本型別的需求 並在析構函式裡編寫delete語句刪除指標指向的記憶體空間。auto ptr 則c 會把m example所指向的記憶體 使m example1 的值為null,所以在c 中,應絕對避免把auto ptr放到容器...

C 之智慧型指標

本文發表於1999年10月份的c c users journal,17 10 1.為什麼稱它為 自動 指標?auto ptr只是眾多可能的智慧型指標之一。許多商業庫提供了更複雜的智慧型指標,用途廣泛而令人驚異,從管理引用的數量到提供先進的 服務。可以把標準c auto ptr看作智慧型指標的ford...

C 之智慧型指標

c 中有四個智慧型指標 auto ptr,shared ptr,weak ptr,unique ptr,其中後三個是c 11支援,並且第乙個已經被c 11棄用。智慧型指標從書面意思來說,就是智慧型。主要是動態記憶體的使用很容易出問題,要在正確的時間正確釋放記憶體是很困難的。有時我們可能忘了釋放記憶體...