std::weak_ptr: 锁还是 shared_ptr 构造函数?

std::weak_ptr: lock or shared_ptr constructor?

似乎有两种方法可以暂时获取weak_ptr指向的资源的所有权:

  1. 使用lock()
  2. weak_ptr 传递给 shared_ptr 构造函数

这两个都会产生一个 shared_ptr,在 weak_ptr 为空且 shared_ptr 构造函数抛出异常的情况下,锁返回一个 nullptr

所以问题是:什么时候应该使用其中之一?是否有与此相关的一般准则或最佳实践?

复制自http://en.cppreference.com/w/cpp/memory/weak_ptr/lock

Both this function and the constructor of std::shared_ptr may be used to acquire temporary ownership of the managed object referred to by a std::weak_ptr. The difference is that the constructor of std::shared_ptr throws an exception when its std::weak_ptr argument is empty, while std::weak_ptr::lock() constructs an empty std::shared_ptr.

这让我相信您根据是否要抛出异常来选择使用哪个。构造函数可以在必须工作的时候使用,而lock可以在它可能不工作的时候使用,你可以检查。