C 面試 C 11 新特性之智慧型指標

2021-08-17 23:52:01 字數 2961 閱讀 2669

shared_ptr 基本用法

shared_ptr**採用引用計數的方式管理所指向的物件**。當有乙個新的shared_ptr指向同乙個物件時(複製shared_ptr等),引用計數加1。當shared_ptr離開作用域時,引用計數減1。當引用計數為0時,釋放所管理的記憶體。

這樣做的好處在於解放了程式設計師手動釋放記憶體的壓力。之前,為了處理程式中的異常情況,往往需要將指標手動封裝到類中,通過析構函式來釋放動態分配的記憶體;現在這一過程就可以交給shared_ptr去做了。

一般我們使用make_shared來獲得shared_ptr。

cout

<<"test shared_ptr base usage:"

p1 = make_shared("");

if(p1 && p1->empty())

*p1 = "hello";

auto p2 = make_shared("world");

cout

<<*p1<<' '

<<*p2<<"test shared_ptr use_count:"

<<"p1 cnt:"

<"\tp2 cnt:"

cout

<<"p1 cnt:"

<"\tp2 cnt:"

<"\tp3 cnt:"

<<"p1 cnt:"

<"\tp2 cnt:"

<"\tp3 cnt:"

cout

<<"test shared_ptr and new:"

p4(new

int(1024));

//shared_ptrp5 = new int(1024); // wrong, no implicit constructor

cout

<<*p4《但是,不能將乙個new表示式返回的指標賦值給shared_ptr。

另外,特別需要注意的是,不要混用new和shared_ptr!

void process(shared_ptr

ptr)

cout

<<"test shared_ptr deleter:"

int(1024);

shared_ptr

p8(p7, print_at_delete);

p8 = make_shared(1025);

unique_ptr基本用法

unique_ptr對於所指向的物件,正如其名字所示,是獨佔的。所以,不可以對unique_ptr進行拷貝、賦值等操作,但是可以通過release函式在unique_ptr之間轉移控制權。

cout

<<"test unique_ptr base usage:"

up1(new

int(1024));

cout

<<"up1: "

<<*up1 up2(up1.release());

cout

<<"up2: "

<<*up2//up2 = up1; // wrong, unique_ptr can not copy

unique_ptr up4(new

int(1025));

up4.reset(up2.release());

cout

<<"up4: "

<<*up4<unique_ptr 作為引數和返回值

上述對於拷貝的限制,有兩個特殊情況,即unique_ptr可以作為函式的返回值和引數使用,這時雖然也有隱含的拷貝存在,但是並非不可行的。

unique_ptr clone(int p)

void process_unique_ptr(unique_ptr up)

{ cout

<<"process unique ptr: "

<<*up<<"test unique_ptr parameter and return value:"

cout

<<"up5: "

<<*up5unique_ptr同樣可以設定deleter,和shared_ptr不同的是,它需要在模板引數中指定deleter的型別。好在我們有decltype這個利器,不然寫起來好麻煩。

cout

<<"test unique_ptr deleter:"

int(1024);

unique_ptr up6(p9, print_at_delete);

unique_ptr up7(new

int(1025));

up6.reset(up7.release());

weak_ptr一般和shared_ptr配合使用。它可以指向shared_ptr所指向的物件,但是卻不增加物件的引用計數。這樣就有可能出現weak_ptr所指向的物件實際上已經被釋放了的情況。因此,weak_ptr有乙個lock函式,嘗試取回乙個指向物件的shared_ptr。

cout

<<"test weak_ptr basic usage:"

(1024);

weak_ptr wp1(p10);

cout

<<"p10 use_count: "

< int(1025)); // this will cause wp1.lock() return a false obj

shared_ptr

p11 = wp1.lock();

if(p11) cout

<<"wp1: "

<<*p11<<" use count: "

<

C 11新特性之智慧型指標

這一節將從用法上 記憶體儲存上以及生存週期上,對unique ptr,shared ptr和weak ptr做乙個深入剖析。unique ptr 不共享它的指標。它無法複製到其他 unique ptr,無法通過值傳遞到函式,也無法用於需要副本的任何標準模板庫 stl 演算法。只能移動 unique ...

c 11 新特性 智慧型指標使用詳解

c 11新增了新的智慧型指標,unique ptr shared ptr和weak ptr,同時也將auto ptr置為廢棄 deprecated 但是在實際的使用過程中,很多人都會有這樣的問題 不知道三種智慧型指標的具體使用場景 無腦只使用shared ptr 認為應該禁用raw pointer ...

C 11之智慧型指標

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