c++ - 理解构造函数抛出的异常

标签 c++ exception constructor

我正在阅读 Scott Meyers 的Effective 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;
}

现在,他在示例之后给出的解释是关于代码如何是异常安全的。

Now, if new Bitmap throws an exception, pb (and the Widget it's inside of) remains unchaged)

我不明白。如果构造函数抛出异常将我们引向 UB,我们怎么能在这里谈论不变(因为运算符 delete 不会在 new 运算符返回的指针上被调用,这导致在异常(exception)情况下)?

最佳答案

如果构造函数抛出,operator new will not keep the memory allocated .这可以防止内存泄漏。

请注意,内存泄漏不会是未定义行为。

关于c++ - 理解构造函数抛出的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30858825/

相关文章:

Java反射从类名获取构造函数失败

c++ - 列表如何知道在哪里插入(有效地)但不能进行随机访问?

c++ - 使用默认函数模板参数的意外重载决议

c++ - 使用 SSE 的矩阵乘法

java - 如何捕获 "Invalid hex digit"?

java - 关于try-catch

C++ 定义 3 个参数但只使用 2 个

c++ - 可以从此函数中删除递归吗?

java - 我们可以在java中扩展检查/非检查异常吗

c++ - c++中继承的构造函数