c++11 :unique_ptr

life4711發表於2016-03-27

建立和使用unique_ptr 例項

unique_ptr不共享它的指標。他無法複製到其他的unique_ptr,無法通過值傳遞到函式,也無法用於需要副本的任何標準模板庫(STL)演算法。只能移動unique_ptr,這意味著,記憶體資源所有權將轉移到另一個unique_ptr,並且原始的unique_ptr 不在擁有此資源。建議將物件限制為由一個所有者所有,因為多個所有權會使程式邏輯變的複雜。因此,當需要智慧指標用於純c++物件是,可使用unique_ptr,而構造unique_ptr時,可使用make_unique Helper 函式。
下圖演示了兩個unique_ptr例項之間的所有權的轉換。

unique_ptr 在STL的標頭中定義。它與原始指標一樣有效,並可用於STL容器,將unique_ptr適量中新增到STL容器很有效,因為通過unique_ptr的移動建構函式,不需要進行復制操作。
以下例項演示如何建立unique_ptr例項並在函式之間傳遞這些例項

    unique_ptr<Song>SongFactory(const std::wstring& artist,const std::wstring &title)
    {
        return make_unique<Song>(artist,title);
    }
    void MakeSongs()
    {
        auto song=make_unique<Song>("Mr.Children","Namonaki Uta");
        vetor<wstring> titles={song->title};

        unique_ptr<Song> song2 = std::move(song);
        auto song3=SongFactory("Michael Jackson","Beat lt");
    }

這些例項說明了unique_ptr的基本特徵:可移動不可以複製。“移動”將所有權轉移到新的unique_ptr並重置舊unique_ptr.

 void Songvector()
 {
     vector <unique_ptr<Song> > songs;
     //create a few new unique_ptr<Song> instances
     //ans add them to vector using implicit move semantics.
     songs.push_back(make_unique<Song>("xxx","yyy"));
     songs.push_back(make_unique<Song>("zzz","kkk"));
     for(const auto& song : songs){
     cout << song->artist<<song->title<<endl;
     }   
 }

在range for 迴圈中,注意unique_ptr通過引用來傳遞。如果你嘗試通過此處的值傳遞,由於刪除了unique_ptr 複製建構函式,編譯器將引發錯誤。
以下示例演示如何初始化類成員unique_ptr

class MyClass
 {
private:
    unique_ptr<ClassFactory> factory;
public:
    MyClass():factory(make_unique<ClassFactory>())
    {}
    void MakeClass()
    {
        factory->DoSomething();
    }   
 }

可以使用make_unique 建立到陣列,但是無法使用make_unique初始化陣列元素

  auto p=make_unique<int[]>(5)
  for(int i=0;i<5;i++)
  {
      p[i]=i;
  }

參考網址

相關文章