![](/img/trans.png)
[英]Understanding C++ std::shared_ptr when used with temporary objects
[英]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
sptr1
和sptr3
對象如何知道引用計數在打印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_shared
說make_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.