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

时间:2015-11-17 04:03:25

标签: c++ shared-ptr

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

  

此外,对此功能的调用具有相同的副作用   shared_ptr的析构函数在其值更改之前被调用(包括   如果此shared_ptr是唯一的,则删除托管对象。

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

2 个答案:

答案 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)

该函数采用指针。这意味着必须在执行函数之前完成新的操作。在函数内部,我假设只有一个指针和一些整数类型被分配,而那些不会抛出。