unique ptr程式設計

2021-10-17 09:41:55 字數 2107 閱讀 3500

示例**

電子工業出版社《c++ primary中文版(第5版)》

與shared_ptr不同的是,某個時刻只能有乙個unique_ptr指向乙個給定的物件。當unique_ptr被銷毀時,它所指向的物件也被銷毀。此外,沒有類似make_shared的標準庫函式返回乙個unique_ptr。當我們定義乙個unique_ptr時,需要將其繫結到乙個new返回的指標上。如:

unique_ptr<

int>p1(

newint(0

));//p1指向乙個指為0的int

下面是unique_ptr支援的一些操作:

unique_ptr u1							//空unique_ptr,可以指向型別為t的物件,使用delete來釋放它的指標

unique_ptr u2 //同上,但使用乙個型別為d的可呼叫物件來釋放它的指標

u1.release()

//u1放棄對指標的控制權,返回指標,並將u1置為空

u1.reset

(q)//如果提供了內建指標q,令u1指向這個物件,否則將u1值為空

更多關於unique_ptr的操作詳見教材p418。

c++定義了另一種new表示式語法,可以分配並初始化乙個物件陣列。為了使new分配乙個物件陣列,需要在型別名後邊跟一對方括號,在其中指明要分配的物件的數目。如:

int

*p1 =

newint[7

];//分配乙個7個int的陣列,p1指向第乙個int

int*p2 =

newint[7

]();

//陣列包含7個值為0的int

int*p3 =

newint[3

];//陣列的三個元素為1、2、0

方括號中的大小必需是整形,但不必是常量。其中第乙個陣列未初始化,初始值為隨機值;第二個陣列所有元素初始化為0;第三個陣列按花括號內的順序初始化為1、2,剩餘的元素被初始化為0。在這些例子中new都分配int陣列,返回的是指向第乙個int的指標,即,分配乙個陣列會得到其中乙個元素型別的指標,而不是指向陣列的指標

若要釋放動態陣列,則必須在delete表示式後加上空的方括號。如:

delete

p;

標準庫提供了乙個可以管理new分配的陣列的unique_ptr版本。為了用乙個unique_ptr管理動態陣列,必須在物件型別後面跟一對空方括號。如:

unique_ptr<

int[

]>up(

newint[7

]);//up指向乙個包含10個未初始化int的陣列

up.release()

;//自動使用delete銷毀其指標

其中up指向的是乙個int陣列而不是乙個int,因此,當up銷毀管理它的指標時,會自動使用delete。此外,unique_ptr不支援點和箭頭成員運算子。

與unique_ptr不同,shared_ptr不直接支援管理動態陣列。如果希望使用shared_ptr管理乙個動態陣列,必須提供自己定義的刪除器。詳見**注釋部分。同時shared_ptr未定義下標運算子,而且智慧型指標型別不支援指標算數運算,因此,為了訪問陣列中的元素,必須使用get獲取乙個內建指標,然後使用它來訪問陣列元素。詳見**注釋部分

#include

#include

using

namespace std;

//給shared_ptr使用的自定義的刪除器

void

deleter

(int

*p)//delete p中的方括號說明p指向乙個陣列,執行的是釋放陣列的操作

intmain

(void

)

執行結果:

unique ptr使用總結

includestd unique ptrpname auto pname std make unique hello c 14 support make unique可以用乙個unique ptr初始化另外乙個unique ptr嗎?不可以,但是可以進行所有權轉移 vector可以裝unique ...

unique ptr的相關使用

unique ptr由c 11中引入,用於替代不安全的auto ptr。unique ptr是一種定義在 memory 中的只能指標。它持有對物件的獨有權 這意味著,記憶體資源所有權可以轉移到另外乙個unique ptr,並且原始的unique ptr不再擁有次資源。實際使用中,建議將物件限制為由乙...

unique ptr指定刪除器

unique ptr指定刪除器有幾種方式 預設刪除器std default delete 普通函式 std function lambda表示式 仿函式 普通函式 include include include intmain ptr 9 9 getchar return0 上面的寫法在lambda...