std::weak_ptr: 锁还是 shared_ptr 构造函数?
std::weak_ptr: lock or shared_ptr constructor?
似乎有两种方法可以暂时获取weak_ptr
指向的资源的所有权:
- 使用
lock()
- 将
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
可以在它可能不工作的时候使用,你可以检查。
似乎有两种方法可以暂时获取weak_ptr
指向的资源的所有权:
- 使用
lock()
- 将
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
可以在它可能不工作的时候使用,你可以检查。