了解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);
函数的异常安全性。在文档中,我发现:
此外,调用此函数会产生与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
也是如此。
函数接受一个指针。这意味着必须在执行进入函数之前完成新操作。在函数内部,我假设只分配了一个指针和一些整数类型的指针,而它们不会抛出。
相关文章:
- 处理多个异常集合的C++方法
- 我在c++代码中生成了一个运行时#3异常
- 孤立代码块在结构中引发异常
- C++中的赋值发生,尽管右侧出现异常
- 从构造函数抛出异常时如何克服内存泄漏
- 异常属于C++中的线程还是进程
- 当类定义不可见时捕获异常
- 类与私有变量的其他类之间的线程安全性
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 为什么异常不退出程序?
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- 如何修复链表类实现的未处理异常0xDDDDDDDD
- 关于:C++中异常对象的范围:为什么我没有得到副本?
- 是否值得降低我的代码的可读性,以便在出现内存不足错误时提供异常安全性?
- C++隐式生成的赋值运算符的异常安全性
- 提高异常和线程安全性 - 优于常规异常处理
- 了解shared_ptr::void reset(U*p);的异常安全性;
- 可能失败的函数的接收参数和移动语义(强异常安全性)
- 函数的异常安全性
- 自包含应用程序中的异常安全性