簡體   English   中英

了解C ++ std :: shared_ptr

[英]Understanding C++ std::shared_ptr

我有一個問題,請通過以下簡單的C ++程序,

int main( )
{
 shared_ptr<int> sptr1( new int );
 shared_ptr<int> sptr2 = sptr1;
 shared_ptr<int> sptr3;
 shared_ptr<int> sptr4;
 sptr3 = sptr2;

 cout<<sptr1.use_count()<<endl;
 cout<<sptr2.use_count()<<endl;
 cout<<sptr3.use_count()<<endl;

 sptr4 = sptr2;

 cout<<sptr1.use_count()<<endl;
 cout<<sptr2.use_count()<<endl;
 cout<<sptr3.use_count()<<endl;

 return 0;
}

輸出:

3
3
3
4
4
4

sptr1sptr3對象如何知道引用計數在打印4時遞增。

據我所知,引用計數是每個shared_ptr對象中的變量。

據我所知,引用計數是每個shared_ptr對象中的變量。

不,引用計數存儲在堆上的“控制塊”中。 每個shared_ptr實例都指向相同的“控制塊”並使其保持活動狀態(直到所有實例和與它們共享所有權的所有weak_ptr實例都已死)。

shared_ptr<T>通常實現為兩個指針。 一個是對象數據,一個是結構,如下所示:

[strong reference count]
[weak reference count]
[type-erased destroyer fptr]
[type-erased destroyer data]

其中[object ptr]指向實際對象。

當您復制shared_ptr ,它會創建另一個指向上述數據(和實際對象)的指針,並增加它的[strong reference count]部分。 弱指針表現相似,但相反增加[weak reference count] (當強為0且弱為非零時 - 調用類型擦除的驅逐艦但控制塊仍然存在)。

make_sharedmake_shared ,當你調用make_shared它會:

[strong reference count]
[weak reference count]
[type-erased destroyer fptr]
[object data]

指向對象的指針現在指向控制塊末尾的[object data] 這將分配的數量減少到一個。

需要單獨的數據和控制塊指針,因為諸如派生的shared_ptr可以被改變為shared_ptr到base的特征; 在許多情況下需要調整指針值。 類似地,共享ptr的別名構造函數允許控制塊和指向的對象完全不相關。

取自@Estinox的回答 - 這不是一個答案,這里是關於共享ptr如何工作的Channel9談話

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM