讨论/《C++ 面试突击》 - 使用智能指针会出现什么问题?怎么解决?/
《C++ 面试突击》 - 使用智能指针会出现什么问题?怎么解决?
共 2 个回复

没有啥妙的:

  1. 说的高大上就是weak_ptr只能拥有shared_ptr的观测权,没有使用权,想要使用的时候,就将weak_ptr转为shared_ptr,这个时候新产生的shared_ptr对象是不会引起循环引用的问题,因为它在它的作用域结束后肯定要释放的,和weak_ptr所在的类对象没有任何关系了。
  2. 有这样的想法也很正常,既然都使用shared_ptr会出现循环引用的问题,所以只要将其中某一条引用链断了就可以了,自然而然可以想到使用一个中间产品(weak_ptr),并且提供weak_ptr像shared_ptr转换的方法即可。
  3. 查看MSVC的memory文件,可以看到shared_ptr和weak_ptr都是继承于ptr_base的,在ptr_base中存放了资源指针_Ptr以及引用计数指针_Rep,而shared_ptr类中定义了一些对资源_Ptr操作的方法,但是在weak_ptr中,只有“资源观测权”的方法:

expired(查看资源是否还存在):

	_NODISCARD bool expired() const noexcept
		{	// return true if resource no longer exists
		return (this->use_count() == 0);
		}

lock(将weak_ptr构造为shared_ptr):

	_NODISCARD shared_ptr<_Ty> lock() const noexcept
		{	// convert to shared_ptr
		shared_ptr<_Ty> _Ret;
		(void) _Ret._Construct_from_weak(*this);
		return (_Ret);
		}
	};
2

秒呀 这个weakptr是怎么实现的