理解 shared_ptr::void reset (U* p) 的异常安全;

Understanding exception safety of shared_ptr::void reset (U* p);

我正在尝试了解 template <class U> void shared_ptr::reset (U* p); 函数的异常安全性。 In the documentation 我发现了这个:

Additionally, a call to this function has the same side effects as if shared_ptr's destructor was called before its value changed (including the deletion of the managed object if this shared_ptr was unique).

因此,我们可以假设析构函数不会抛出异常。但是如果 operator new 抛出怎么办? shared_ptr 会是什么状态呢?是否保持不变?

该函数接受一个指针。这意味着 new 必须在执行进入函数之前完成。在函数内部我假设只有一个指针和一些整数类型被分配并且那些不会抛出。

根据 [util.smartptr.shared.mod],shared_ptr::reset(stuff) 的所有四个重载完全等同于

shared_ptr(stuff).swap(*this)

如果构造 shared_ptr(stuff) 抛出(例如,如果分配新的控制块(或实现使用的任何等效机制)抛出),则 *this 不受影响,因为您永远不会到达 swap,并且在 stuff 中传递的任何指针都被适当删除(因为这是由 shared_ptr 的构造函数保证的)。

swap 本身不抛出,交换后销毁临时 shared_ptr 也是如此。