天天看點

【智能指針】

1.背景

動态記憶體的使用很容易出問題,確定在正确的時間釋放記憶體是極其困難的。忘記釋放記憶體時會産生記憶體洩露;當尚有指針引用記憶體的情況下釋放它,會産生引用非法記憶體的指針。

智能指針能自動釋放所指向的對象。新的标準庫提供了兩種智能指針:

(1)shared_ptr:基于引用計數,允許多個指針指向同一個對象;

(2)unique_ptr:拷貝構造與指派不能使用,實作獨占的智能指針;

另外還有一個weak_ptr 弱引用,指向shared_ptr所管理的對象。

2.shared_ptr

智能指針是模闆,使用時需要指定類型:

(1) 基本的使用

有效性判斷:

//判斷智能指針p1是否為空,已經字元串是否為空
if(p1  && p1->empty())
{
    //do something
}
           

(2)更安全的使用方式

最安全的配置設定和使用動态記憶體的方法是調用:make_shared函數。當使用make_ptr時必須要指定對象類型:

使用make_shared的優勢:共享指針管理對象本身,以及包含引用計數和其他管家資料的小對象。

  • make_shared可以配置設定單個記憶體塊來儲存這兩個記憶體; 從指向已配置設定對象的指針構造共享指針将需要配置設定第二個塊來存儲引用計數,效率較高。
  • 使用make_shared意味着您根本不需要處理new和原始指針,進而提供更好的異常安全性,在配置設定對象之後但在将其配置設定給智能指針之前不可能抛出異常。

    (3)shared_ptr和new結合使用

    接受指針參數的智能指針構造函數是explicit的,不能将一個内置指針隐式轉換為一個智能指針,必須使用直接初始化形式來初始化:

shared_ptr<int> p1 = new int(1024);   //錯誤:必須使用直接初始化形式
shared_ptr<int> p2(new int(1024));       //正确
           
  • 不要混合使用普通指針和智能指針;
  • 不要使用get初始化另外一個智能指針或為智能指針指派;