C++動態內存管理之shared_ptr、unique_ptr

C++中的動態內存管理是經過new和delete兩個操做符來完成的。new操做符,爲對象分配內存並調用對象所屬類的構造函數,返回一個指向該對象的指針。delete調用時,銷燬對象,並釋放對象所在的內存。但在程序中使用new和delete容易致使不少問題,這裏列出三個比較容易犯的錯誤。c++

  1. 咱們new了一個對象,但沒有delete它。這會引發memory leak內存泄露,可能會致使程序崩潰。
  2. 用指針訪問一個已經被free的對象。這就是咱們常說的dangling pointer。
  3. delelte同一個內存區域兩次。若是兩個指針指向同一個內存區域,那咱們delete一個指針後,再用另外一個指針訪問其指向的內存區域就會出現問題。

爲了解決上面的問題,方便動態內存管理,c++提出了smart pointer的概念,在STL庫中對應的實現主要有兩種:shared_ptr、unique_ptr。下面咱們主要介紹這兩種smart pointer。函數

  1. shared_ptr:是一個模板類,定義在<memory>頭文件裏。shared_ptr對象會在其做用域結束時,自動銷燬,若是該shared_ptr是指向某對象A的最後一個shared_ptr,那麼A所在的內存會被釋放。應用舉例:shared_ptr<int> p(new int(4)); 或者用make_shared<T>()函數生成shared_ptr,shared_ptr<int> p = make_shared<int>(4)。
  2. unique_ptr:也是一個模板類,一樣定義在<memory>頭文件裏。與shared_ptr不一樣的是,unique_ptr是本身」擁有「一個指向的對象,也就是說不一樣有兩個或者以上的unique_ptr指向同一個對象。在一個unique_ptr對象的做用域結束時,unique_ptr指向的對象的內存被釋放。爲了保證unique_ptr對對象的獨有性,賦值、複製操做是不容許的。但有一個例外,咱們能夠在函數中return一個unique_ptr。應用舉例:unique_ptr<int> p(new int(4))。unique_ptr是c++11引入的,其以前對應的是auto_ptr,與unique_ptr不一樣的是,咱們不能再函數中返回auto_ptr對象。

在程序中運用smart pointer還有一個優勢,就是smart pointer保證其指向的動態內存被釋放不論程序是否正常結束,而new和delete不能保證這一點。shared_ptr和unique_ptr在釋放對象內存時默認用delete,不過咱們能夠指定本身的deleter,具體內容可參考C++ Primier Dynamic Memory部分。指針

相關文章
相關標籤/搜索