![](/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.