#include <memory>
本節我們先來討論 unique_ ptr。
unique_ptr<int> uptr1(new int);
unique_ptr<double> uptr2(new double);
unique_ptr<int> uptr3;
uptr3 = unique_ptr<int> (new int);
int *p = new int;
unique_ptr<int> uptr(p);
uptr1 ++;
uptr1 = uptr1 + 2;
*
和 ->
。以下程式碼將解除參照一個獨佔指標,以給動態分配記憶體位置賦值,遞增該位置的值,然後列印結果:
unique_ptr<int> uptr(new int);
*uptr = 12;
*uptr = *uptr + 1;
cout << *uptr << endl;
unique_ptr<int> uptr1(new int);
unique_ptr<int> uptr2 = uptr1; // 非法初始化
unique_ptr<int> uptr3; // 正確
uptr3 = uptr1; // 非法賦值
unique_ptr<int> uptr1(new int);
*uptr1 = 15;
unique_ptr<int> uptr3; // 正確
uptr3 = move (uptr1) ; // 將所有權從 uptr1 轉移到 uptr3
cout << *uptr3 << endl; // 列印 15
U = move(V);
那麼,當執行該語句時,會發生兩件事情。首先,當前 U 所擁有的任何物件都將被刪除;其次,指標 V 放棄了原有的物件所有權,被置為空,而 U 則獲得轉移的所有權,繼續控制之前由 V 所擁有的物件。//函數使用通過值傳遞的形參 void fun(unique_ptr<int> uptrParam) { cout << *uptrParam << endl; } int main() { unique_ptr<int> uptr(new int); *uptr = 10; fun (move (uptr)); // 在呼叫中使用 move }以上程式碼將列印來自於函數 fun() 中的 10。
//函數使用通過參照傳遞的值 void fun(unique_ptr<int>& uptrParam) { cout << *uptrParam << endl; } int main() { unique_ptr<int> uptr(new int); *uptr1 = 15; fun (uptr1) ; //在呼叫中無須使用move }以上程式碼在執行時將列印數位 15。
//返回指向動態分配資源的獨佔指標 unique_ptr<int> makeResource() { unique_ptr<int> uptrResult(new int); *uptrResult = 55; return uptrResult; } int main() { unique_ptr<int> uptr; uptr = makeResource () ; // 自動移動 cout << *uptr << endl; }該程式的輸出結果為 55。
uptr = nullptr;
uptr.reset();
unique_ptr<int> uptr(new int);
現在可以棄用上面的程式碼,而改為使用以下程式碼:unique_ptr<int> uptr = make_unique<int>();
unique_ptr<int[]> uptr(new int[5]);
前面介紹過,智慧指標 uptr 可以像一個指向int的普通指標那樣使用;前面還介紹過,可以對指標使用陣列符號,因此,可以如以下方式編寫一個程式,在像 up[k] 這樣的陣列中儲存整數的平方值:int main() { //指向陣列的獨佔指標 uriique_ptr<int [ ] > up (new int [5]); //設定陣列元素為整數的平方值 for (int k = 0; k < 5; k++) { up[k] = (k + l)*(k + 1); } //列印陣列元素 for (int k = 0; k < 5; k++) { cout << up[k] <<" "; } cout << endl; }以上程式碼的輸出結果將是
"1 4 9 16 25"
。unique_ptr<int[]> up = make_unique<int[]>(5);
成員函數 | 描 述 |
---|---|
reset() | 銷毀由該智慧指標管理的任何可能存在的物件。該智慧指標被置為空 |
reset(T* ptr) | 銷毀由該智慧指標當前管理的任何可能存在的物件。該智慧指標繼續控制由裸指標 ptr 指向的物件 |
get() | 返回該智慧指標管理的由裸指標指向的物件。如果某個指標需要傳遞給函數,但是 該函數並不知道該如何操作智慧指標,則 get() 函數非常有用 |