C 智慧型指標

2021-10-05 12:44:47 字數 1761 閱讀 7922

#include

#include

using

namespace std;

class

test

~test()

string &

getstr()

void

setstr

(string s)

void

print()

private

: string str;};

unique_ptr

fun(

)int

main()

cout << endl << endl;

cout << endl << endl;

//此時程式中還有兩個物件,呼叫兩次析構函式釋放物件

cout << endl << endl;

//share_ptr

cout << endl << endl;

/*weak_ptr

weak_ptr是用來解決shared_ptr相互引用時的死鎖問題,如果說兩個shared_ptr相互引用,

那麼這兩個指標的引用計數永遠不可能下降為0,資源永遠不會釋放。

它是對物件的一種弱引用,不會增加物件的引用計數,

和shared_ptr之間可以相互轉化,shared_ptr可以直接賦值給它,它可以通過呼叫lock函式來獲得shared_ptr。

*/};

class

bvoid

print()

};shared_ptrpb(

newb()

);shared_ptrpa(

newa()

);pb-

>pa_ = pa;

pa->pb_ = pb;

cout << pb.

use_count()

<< endl;

// 2

cout << pa.

use_count()

<< endl;

// 2

//可以看到fun函式中pa ,pb之間互相引用,兩個資源的引用計數為2,當要跳出函式時,

//智慧型指標pa,pb析構時兩個資源引用計數會減一,但是兩者引用計數還是為1,

//導致跳出函式時資源沒有被釋放(a b的析構函式沒有被呼叫),

//如果把其中乙個改為weak_ptr就可以了,我們把類a裡面的shared_ptrpb_;

//改為weak_ptrpb_; 執行結果如下,這樣的話,資源b的引用開始就只有1,當pb析構時,

//b的計數變為0,b得到釋放,b釋放的同時也會使a的計數減一,同時pa析構時使a的計數減一,那麼a的計數為0,a得到釋放。

//注意的是我們不能通過weak_ptr直接訪問物件的方法,比如b物件中有乙個方法print(),我們不能這樣訪問,pa->pb_->print();

// 英文pb_是乙個weak_ptr,應該先把它轉化為shared_ptr,如:shared_ptrp = pa->pb_.lock(); p->print();

// pa->pb_->print(); // not ok

shared_ptrp = pa-

>pb_.

lock()

; p-

>

print()

;}return0;

}//

參考:

c++智慧型指標總結

【c++】智慧型指標詳解

c++智慧型指標的分析與使用

c 智慧型指標

auto prt 它是 它所指向物件的擁有者 所以當自身物件被摧毀時候,該物件也將遭受摧毀,要求乙個物件只有乙個擁有者,注意 auto prt 不能使用new 來分配物件給他 include include using namespace std template void bad print au...

c 智慧型指標

很久沒寫部落格了,不知道如何表達了,哈哈.我先介紹一下深淺拷貝.class copy 此時a.ptr和b.ptr指向同乙個物件,當我們delete a.ptr時 b.ptr所指向的物件已經不存在了,要是我們引用b.ptr指向的物件也就會出問題了.深拷貝 把a.ptr所指向的物件拷貝乙份給b.ptr ...

c 智慧型指標

記得前不久有一次面試被問到智慧型指標的實現,當時對智慧型指標只是聽說但沒有了解過,就亂七八糟地說了一遍。今天寫了一遍智慧型指標,用了引用計數的概念。主要思想就是,用乙個新類對原本需要的型別進行了一層封裝,這個新類中儲存了原本的物件指標和乙個引用計數的指標,之所以全部用指標來儲存,就是因為會出現多個新...