C++11智能指針讀書筆記;

智能指針是一個類對象,而非一個指針對象。設計模式

原始指針:經過new創建的*指針函數

智能指針:經過智能指針關鍵字(unique_ptr, shared_ptr ,weak_ptr)創建的指針性能

它的一種通用實現方法是採用引用計數的方法。智能指針將一個計數器與類指向的對象相關聯,引用計數跟蹤共有多少個類對象共享同一指針。設計

    每次建立類的新對象時,初始化指針並將引用計數置爲1;指針

    當對象做爲另外一對象的副本而建立時,拷貝構造函數拷貝指針並增長與之相應的引用計數;對象

    對一個對象進行賦值時,賦值操做符減小左操做數所指對象的引用計數(若是引用計數爲減至0,則刪除對象),並增長右操做數所指對象的引用計數;這是所以左側的指針指向了右側指針所指向的對象,所以右指針所指向的對象的引用計數+1;內存

    調用析構函數時,構造函數減小引用計數(若是引用計數減至0,則刪除基礎對象)。資源

 

unique_ptr 
只容許基礎指針的一個全部者。 除非你確信須要 shared_ptr,不然請將該指針用做 POCO 的默認選項。 能夠移到新全部者,但不會複製或共享。 替換已棄用的auto_ptr。 與 boost::scoped_ptr 比較。 unique_ptr 小巧高效;大小等同於一個指針且支持 rvalue 引用,從而可實現快速插入和對 STL 集合的檢索。 頭文件:<memory>。 有關更多信息,請參見如何:建立和使用 unique_ptr 實例unique_ptr 類get

shared_ptr 
採用引用計數的智能指針。 若是你想要將一個原始指針分配給多個全部者(例如,從容器返回了指針副本又想保留原始指針時),請使用該指針。 直至全部shared_ptr 全部者超出了範圍或放棄全部權,纔會刪除原始指針。 大小爲兩個指針;一個用於對象,另外一個用於包含引用計數的共享控制塊。 頭文件:<memory>。 有關更多信息,請參見如何:建立和使用 shared_ptr 實例shared_ptr 類it

weak_ptr 
結合 shared_ptr 使用的特例智能指針。 weak_ptr 提供對一個或多個 shared_ptr 實例擁有的對象的訪問,但不參與引用計數。 若是你想要觀察某個對象但不須要其保持活動狀態,請使用該實例。 在某些狀況下,須要斷開 shared_ptr 實例間的循環引用。 頭文件:<memory>。 有關更多信息,請參見如何:建立和使用共享 weak_ptr 實例weak_ptr 類

 

 

智能指針的設計原則是在內存和性能上儘量高效。 例如,unique_ptr 中的惟一數據成員是封裝的指針。 這意味着,unique_ptr 與該指針的大小徹底相同,不是四個字節就是八個字節。 使用重載了 * 和 -> 運算符的智能指針訪問封裝指針的速度不會明顯慢於直接訪問原始指針的速度。同時智能指針不只在超出控制外圍時能夠釋放內存,在超出範圍以前也能釋放內存。

void SmartPointerDemo2()

{

    // Create the object and pass it to a smart pointer

    std::unique_ptr<LargeObject> pLarge(new LargeObject());

 

    //Call a method on the object

    pLarge->DoSomething();

 

    // Free the memory before we exit function block.

    pLarge.reset();

 

    // Do some other work...

 

}

 

智能指針經常在設計模式中使用的比較多,如工廠模式、策略模式等。另外在大型程序中,對資源的頻繁使用,也會使用到智能指針。具體到代碼中,智能指針的使用場景主要是如下兩點:

一、一個對象被多個指針指向的時候,使用shared_ptr ;

二、一個對象不須要被多個指針指向時,使用shared_ptr;

相關文章
相關標籤/搜索