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

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

本文关键字:安全性 异常 shared ptr void 了解 reset      更新时间:2023-10-16

我正在努力了解template <class U> void shared_ptr::reset (U* p);函数的异常安全性。在文档中,我发现:

此外,调用此函数会产生与shared_ptr的析构函数在其值更改之前被调用(包括如果该shared_ptr是唯一的,则删除托管对象)。

所以,我们可以假设析构函数不会抛出。但是如果operator new抛出呢?那个么shared_ptr的状态是什么?它保持不变吗?

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

shared_ptr(stuff).swap(*this)

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

swap本身是另一行,并且在交换之后破坏临时shared_ptr也是如此。

函数接受一个指针。这意味着必须在执行进入函数之前完成新操作。在函数内部,我假设只分配了一个指针和一些整数类型的指针,而它们不会抛出。