繁体   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