2

我正在阅读这里Boost的文档,一开始它说:weak_ptr

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

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

weak_ptr 操作从不抛出异常。

每个语句指的是什么?

4

3 回答 3

2

shared_ptr从 a构造 aweak_ptr可能会引发bad_weak_ptr异常。(weak_ptr::lock如果您希望能够对此进行测试,请改用。)

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

于 2014-02-24T10:10:50.690 回答
2

该类在内部从不抛出任何操作,当您调用时发生weak_ptr的事情是它捕获( )的构造函数抛出的异常,然后返回一个空的。自己看一下函数的来源以确认。lock()shared_ptrbad_weak_ptrshared_ptrlock()

于 2014-02-24T10:10:51.667 回答
1

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

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

  • shared_ptr 构造函数,如果weak_ptr引用的实例消失了,它会抛出
  • shared_ptr<T> weak_ptr<T>::lock() const;如果weak_ptr 引用的实例消失了,它将返回一个空的shared_ptr 实例。
于 2014-02-24T10:14:27.507 回答