c++11 :unique_ptr
建立和使用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;
}
相關文章
- C++11中unique_ptr的使用C++
- C++11智慧指標之unique_ptrC++指標
- 深入 C++ 的 unique_ptrC++
- 實現一個簡單的 std::unique_ptr
- 【C++11】c++11實現執行緒池C++執行緒
- C++11 tupleC++
- c++11:std::bindC++
- C++11新特性C++
- C++11拾穗C++
- c++11:std::is_sameC++
- C++11 智慧指標C++指標
- 「C++11」Lambda 表示式C++
- Pythy syntax for C++11C++
- C++11特性總彙C++
- std::unique_ptr使用incomplete type的報錯分析和解決
- C++11 併發指南七(C++11 記憶體模型一:介紹)C++記憶體模型
- C++11併發程式設計(一)——初始C++11多執行緒庫C++程式設計執行緒
- 智慧指標思想實踐(std::unique_ptr, std::shared_ptr)指標
- C++11中的函式C++函式
- c++11:std::boolalpha、std::noboolalphaC++
- 深入理解C++11(十四)C++
- C++11獲取時間C++
- C++11智慧指標用法C++指標
- C++11 新特性之 lambdaC++
- c++11 簡明學習C++
- C++11 lambda表示式 原理C++
- C++11/14::右值引用C++
- C++14 智慧指標unique_ptr、shared_ptr、weak_ptrC++指標
- c++11 auto 與 decltype 詳解C++
- C++11 可變引數模板C++
- C++11新關鍵字defaultC++
- C++11 新特性——auto 的使用C++
- qtcreator minggw 支援c++11QTC++
- C++11新特性總結 (二)C++
- C++11新特性總結 (一)C++
- c++11 中的 move 與 forwardC++Forward
- C++11中的右值引用C++
- C++11進階知識列表C++