c 11 智慧型指標之shared ptr

2021-08-08 16:06:04 字數 1648 閱讀 3924

c++11提供了三種智慧型指標:std::shared_ptr,std::unique_ptr和weak_ptr,使用時需要引用標頭檔案< memory >

shared_ptr使用引用計數,每使用它一次內部引用計數加一,沒析構一次,引用計數減一,減為0時釋放所指向的堆記憶體。

可以通過以下三種方法初始化shared_ptr

建構函式

std::make_shared< t >輔助函式

class

person

int value_;

}; std:

:shared_ptr p1(new person(1));//

person(1)的引用計數為1

std:

:shared_ptr p2 = std:

:make_shared(2);

注意,不能將乙個原始指標直接賦值給乙個智慧型指標,如下所示,因為所有的智慧型指標類都有乙個explicit建構函式,以指標作為引數。因此不能自動將指標轉換為智慧型指標物件,必須顯式呼叫

std::shared_ptr

p4 = new

int(1);// error

std::shared_ptr

p4(new

int(5));

int *pint = p4.get();

很少用到,因為shared_ptr過載了operator*和->。

智慧型指標可以指定刪除器,當智慧型指標的引用計數為0時,自動呼叫指定的刪除器來釋放記憶體。std::shared_ptr可以指定刪除器的乙個原因是其預設刪除器不支援陣列物件,這一點需要注意。

當我們用shared_ptr管理動態陣列時,需要指定刪除器,可以如下:

std::shared_ptr

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

也可以將std::default_delete作為刪除器

std:

:shared_ptr p(new int[10], std:

:default_delete);

class tester 

};int main()

//導致兩次釋放t物件破壞堆疊

應改為:

class tester : public enable_shared_from_this

};

struct astruct;

struct bstruct;

struct astruct

};void testloopreference()

//離開testloopreference作用域後,ap和bp的引用計數都為1,雖然他們會呼叫各自的析構函式,

//但是不會去delete掉new出來的原始指標。解決方法是astruct或bstruct改為weak_ptr

C 11之智慧型指標

c 98提供了了智慧型指標auto ptr,但c 11已將其摒棄,並提供了unique ptr和shared ptr。這三種智慧型指標模板都定義了類似指標的物件,可以將new獲得的位址賦給這種物件。當智慧型指標過期時,這些記憶體將自動被釋放。其基本用法如下 include include inclu...

c 11之智慧型指標

由於在c 中我們可以動態分配記憶體,但有時候我們會忘記用 delete或free釋放記憶體,就會導致記憶體洩露。所以c 11提供了智慧型指標這種東西 本文參考了知乎某知乎友的 比如下面這兩種情況 1 記憶體洩漏 str1所指的資源沒有被釋放 2 多重釋放,引起程式崩潰 可能平時都寫在乙個檔案不會忘記...

C 11智慧型指標

本文介紹c 的四種智慧型指標,其中後三種是c 11新增加的,auto ptr已被棄用。要編譯c 11,需要安裝g 4.8 sudo add apt repository ppa ubuntu toolchain r test sudo apt get update sudo apt get inst...