智慧型指標之共享指標

2022-06-23 12:51:47 字數 2517 閱讀 6526

智慧型指標是儲存指向動態分配物件指標的類。三種智慧型指標:std::shared_ptr/std::unique_ptr/std::weak_ptr.

使用時需要加上標頭檔案 #include

1.共享智慧型指標--shared_ptr

初始化

shared_ptr初始化可以通過reset方法初始化shared_ptr。

std::shared_ptr p(new

int(1

));std::shared_ptr

p2 = p; //

p和p2共享同一段記憶體

std::shared_ptrptr;

ptr.reset(

newint(1));

int *p1 = new int[2];

std::shared_ptrp3(p1);

if(ptr)

另外還可以通過std::make_shared輔助函式初始化,盡量使用std::make_shared初始化共享指標,

auto p1 = std::make_shared(10

);auto p2 = std::make_shared(10,"

s");

可以通過過載的bool型別操作符判斷智慧型指標是否為空,即是否未初始化。

if(bool

(ptr))

cout

<< "

the ptr is nullptr

"

cout

<< "

the ptr is not nullptr

"<--獲取原始指標

用get()方法獲取原始指標,如:

std::shared_ptr ptr(new

int(1

));int *p = ptr.get();

--指定刪除器

void deleteintptr(int*p)

std::shared_ptr

p5(new

int,deleteintptr);

或者使用lambda表示式

std::shared_ptr p6(new

int,(int* p));

//管理動態陣列時,需要指定刪除器,shared_ptr預設的刪除器不支援陣列物件

std::shared_ptr p6(new

int[10],(int* p));

//或者使用std::default_delete作為刪除器 

std::shared_ptr p7(new

int[10],std::default_delete);

//此外還可以通過封裝方法讓shared_ptr支援陣列    

templatestd::shared_ptr

make_shared_array(size_t size)

std::shared_ptr

p8 = make_shared_array(10

); std::shared_ptr

p9 = make_shared_array(10);

使用shared_ptr注意事項

1.不能使用原始指標初始化多個shared_ptr

int* p11 = new

int;

std::shared_ptr

p12(p11);

std::shared_ptr

p13(p11);

2.不要在實參中建立shared_ptr,應該先建立乙個智慧型指標,再使用

deleteintptr(std::shared_ptr(new

int));//

錯誤的 std::shared_ptr p14(new

int());

deleteintptr(p14);

//ok

3.要通過shared_from_this()返回this指標

structa};

int main()

採用如下方式,使用enable_shared_from_this類的shared_from_this()方法返回this指標:

class a:public

std::enable_shared_from_this

};

4.避免迴圈使用,如下a/b兩個指標都不會被刪除會有記憶體洩漏

struct a;

struct b;

struct a

}

可以將a或b的任何乙個shared_ptr成員改為weak_ptr。

參考:《深入應用c++1:**優化與工程級應用》

智慧型指標之獨佔指標

2.unique ptr 獨佔指標 獨佔型的指標不允許其它的智慧型指標共享其內部的指標,不允許通過賦值將乙個unique ptr賦值給另外乙個unique ptr unique ptr p1 new int 10 unique ptr p2 p1 錯誤的,不能複製給乙個獨佔的智慧型指標 unique...

智慧型指標 強弱智慧型指標

在平時編寫 的時候經常會用到new來開闢空間,而我們開闢出來的空間必須得手動去delete他,但是如果程式設計師忘記去手動釋放那邊會出現乙個麻煩的問題,記憶體洩漏!或者是一塊記憶體被多個函式同時使用時,如果其中乙個函式不知道還有其他人也在使用這塊記憶體而釋放掉的話同樣也會引起程式的崩潰。引起記憶體洩...

C 之智慧型指標

本文發表於1999年10月份的c c users journal,17 10 1.為什麼稱它為 自動 指標?auto ptr只是眾多可能的智慧型指標之一。許多商業庫提供了更複雜的智慧型指標,用途廣泛而令人驚異,從管理引用的數量到提供先進的 服務。可以把標準c auto ptr看作智慧型指標的ford...