锁()的实现
Implementation of lock()
根据提升:
To access the object, a weak_ptr can be converted to a shared_ptr using the shared_ptr constructor or the member function lock.
同样,来自提升:
shared_ptr<T> lock() const;
//Returns: expired()? shared_ptr<T>(): shared_ptr<T>(*this).
据我理解,返回shared_ptr<T>(*this)
意味着新建一个引用计数为1的shared_ptr;而这绝对不是我们想要的。所以可能我没有理解正确。有人会解释吗?谢谢!
不,这实际上是 shared_ptr 的重点 - 复制的实例将指向相同的基础数据并增加两个实例的引用计数。
这意味着 shared_ptr<T>(*this)
将创建一个指向相同数据的附加 shared_ptr
实例,并将增加 this
和新实例的引用计数。
在实际代码中实际上更复杂,因为原始shared_ptr
数据是通过weak_ptr
实例访问的,但实际上原始shared_ptr
数据在最后共享(随着共享引用计数在特定 shared_ptr
对象的所有现有副本中增加)。
根据提升:
To access the object, a weak_ptr can be converted to a shared_ptr using the shared_ptr constructor or the member function lock.
同样,来自提升:
shared_ptr<T> lock() const;
//Returns: expired()? shared_ptr<T>(): shared_ptr<T>(*this).
据我理解,返回shared_ptr<T>(*this)
意味着新建一个引用计数为1的shared_ptr;而这绝对不是我们想要的。所以可能我没有理解正确。有人会解释吗?谢谢!
不,这实际上是 shared_ptr 的重点 - 复制的实例将指向相同的基础数据并增加两个实例的引用计数。
这意味着 shared_ptr<T>(*this)
将创建一个指向相同数据的附加 shared_ptr
实例,并将增加 this
和新实例的引用计数。
在实际代码中实际上更复杂,因为原始shared_ptr
数据是通过weak_ptr
实例访问的,但实际上原始shared_ptr
数据在最后共享(随着共享引用计数在特定 shared_ptr
对象的所有现有副本中增加)。