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