了解构造函数引发的异常
Understanding exceptions throwing by a constructor
我正在阅读Scott Meyers的有效C++,他提供了一个精心设计的赋值运算符的例子。在这里:
class Bitmap{ ... };
class Widget
{
//...
private:
Bitmap *pb;
};
Widget::operator=(const Widget& rhs)
{
Bitmap *pOrig = pb;
pb = new Bitmap(*rhs.pb);
delete pOrig;
return *this;
}
现在,他在示例后面给出的解释是关于代码如何异常安全的。
现在,如果
new Bitmap
抛出异常,pb(和小部件它是 里面)仍然没有追逐)
我不明白。如果构造函数抛出的解释导致我们进入 UB,我们怎么能在这里谈论不变(因为运算符 delete
不会被new
运算符在指针返回时调用,从而导致异常)?
如果构造函数抛出,operator new
将不会保持分配的内存。这可以防止内存泄漏。
请注意,内存泄漏不会是未定义的行为。
相关文章:
- 从构造函数抛出异常时如何克服内存泄漏
- 如何编写带有异常的构造函数
- 从 C++ 中异常的构造函数引发异常
- 我正在尝试创建一个使用 c++ 中的参数包构造函数的异常类
- 稍后在构造函数中重新启动异常指令删除此指令
- 自定义异常中的用户定义的空构造函数,具有多个继承和抽象基类
- 构造函数中引发的异常
- 如何捕获源自静态分配对象的构造函数的异常?
- 从构造函数内存泄漏引发异常
- C++:如何捕获构造函数引发的异常?
- std::vector::emplace() 真的在面对抛出移动构造函数/赋值运算符时提供了强大的异常保证吗?
- V8 - 节点C++插件 - 在构造函数中引发异常会导致"致命错误:v8::ToLocalChecked Em
- 为什么要抛出引用调用复制构造函数的异常?
- std::vector 默认构造函数可以抛出异常吗?
- 如何防止构造函数在引发异常时创建对象
- 当构造函数的参数类型错误时引发异常
- 异常构造函数中的例外
- C++11 引入了采用 'const char*' 的异常构造函数.但是为什么
- 在异常构造函数中参数化错误消息是一种好的做法吗
- 异常构造函数来填充字符串流