2017-07-26 44 views
3

根据助推:锁的执行情况()

要访问该对象,的weak_ptr可以被转换为使用shared_ptr的构造或成员函数锁定一个shared_ptr。

再次,从升压:

shared_ptr<T> lock() const; 

//Returns: expired()? shared_ptr<T>(): shared_ptr<T>(*this). 

据我明白,返回shared_ptr<T>(*this)装置创建具有的1引用计数一个新的shared_ptr;这绝对不是我们想要的。所以可能我不明白它是正确的。有人会解释吗?谢谢!

回答

3

不,这实际上是shared_ptr的要点 - 复制的实例将指向相同的基础数据并增加两个实例的引用计数。

这意味着shared_ptr<T>(*this)将创建一个指向相同数据的附加shared_ptr实例,并将增加this和新实例的引用计数。


它实际上是在真正的代码更复杂,因为原始shared_ptr数据通过weak_ptr实例访问,但有效的原始shared_ptr数据在端共享(与共享引用计数在所有现有的增加对象的特定shared_ptr对象的副本)。

+0

但是,“返回:”行中显示的代码不是线程安全的。我猜这就是现在*实际*实现(我的标准笔记副本,“原子执行”)。 –

+0

这意味着'模板明确的shared_ptr(weak_ptr的常量& r);'被称为? – Sanich

+0

是的,在技术上原来的shared_ptr实例通过weak_ptr的访问,但仍是(更新答案提及)。 – axalis