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...