boost :: weak_ptr会抛出异常吗?

时间:2014-02-24 10:06:15

标签: c++ boost shared-ptr weak-ptr

我正在阅读Boost hereweak_ptr文档,并在开头说:

  

当对象的最后一个shared_ptr消失而对象是   删除,尝试从weak_ptr获取shared_ptr   引用已删除对象的实例将失败:构造函数   将抛出boost :: bad_weak_ptr类型的异常,并且   weak_ptr :: lock将返回一个空的shared_ptr。

到目前为止,一切都很清楚,然后,2行后说:

  

weak_ptr操作永远不会抛出异常。

每个陈述是指什么?

3 个答案:

答案 0 :(得分:2)

shared_ptr构建weak_ptr可能会引发bad_weak_ptr例外。 (如果您希望能够对此进行测试,请使用weak_ptr::lock。)

weak_ptr对象本身的任何操作都不会抛出。

答案 1 :(得分:2)

weak_ptr永远不会抛出任何操作,在内部,当你调用lock()时发生的事情是它捕获构造函数抛出的异常shared_ptr(bad_weak_ptr)的em>然后返回一个空的shared_ptr。请查看lock()函数的来源,供您自己确认。

答案 2 :(得分:1)

这意味着如果你在weak_ptr引用的共享实例消失时从weak_ptr构造一个shared_ptr(template<class Y> explicit shared_ptr(weak_ptr<Y> const & r);),它将抛出异常。

您有两种方法可以从weak_ptr获取shared_ptr:

  • shared_ptr构造函数,如果weak_ptr引用的实例消失,它将抛出
  • shared_ptr<T> weak_ptr<T>::lock() const;如果weak_ptr引用的实例消失,它将返回一个空的shared_ptr实例。