我试图理解template <class U> void shared_ptr::reset (U* p);
函数的异常安全性。 In the documentation我发现了这个:
此外,对此功能的调用具有相同的副作用 shared_ptr的析构函数在其值更改之前被调用(包括 如果此shared_ptr是唯一的,则删除托管对象。
因此,我们可以假设析构函数不会抛出。但是如果operator new
抛出怎么办?那么shared_ptr
会有什么样的状态呢?它保持不变吗?
答案 0 :(得分:2)
Per [util.smartptr.shared.mod],shared_ptr::reset(stuff)
的所有四个重载都完全等同于
shared_ptr(stuff).swap(*this)
如果构造shared_ptr(stuff)
抛出(例如,如果分配新的控制块(或实现使用的任何等效机制)抛出),那么*this
不受影响,因为你永远不会到达{{1并且swap
中传递的任何指针都会被相应删除(因为stuff
的构造函数保证了这一点。)
shared_ptr
本身并不存在,因此在交换后会破坏临时swap
。
答案 1 :(得分:1)
该函数采用指针。这意味着必须在执行函数之前完成新的操作。在函数内部,我假设只有一个指针和一些整数类型被分配,而那些不会抛出。