c++ - 处理失败的构造函数

标签 c++ exception constructor

我正在阅读 C++ FAQ 中的失败构造函数并且不理解下面的代码。

void f()
{
  X x;             ← if X::X() throws, the memory for x itself will not leak
  Y* p = new Y();  ← if Y::Y() throws, the memory for *p itself will not leak
}

如果构造函数抛出异常,p指向的内存怎么可能不会泄漏?我假设顺序如下。

  1. 为对象 Y 分配内存。
  2. 调用 Y 的构造函数。
  3. Y 的构造函数抛出异常,p 指向的内存泄漏。

最佳答案

如果 Y 的构造函数抛出异常,则堆栈将展开,包括删除为 Y 分配的内存。

问题主要出现在当/如果您有多个对象需要处理时。例如:

void f() { 
    X *x = new X();
    Y *y = new Y();
}

现在,如果 new X() 部分成功,但 new Y() 部分失败,则为 y 分配的内存将被删除,但是 x 不会被销毁,并且它的内存会被泄漏。如果您确实坚持的话,您可以使用try block 解决这个问题:

try { 
    X *x = new X();

    Y * y = new Y();
}
catch (y_construction_failed) {
    delete x;
}

这样做的一个大问题是,如果你有两个以上的项目,你就必须嵌套 try block ,所以如果你需要,比如说,六个局部变量,它会很深嵌套且极其丑陋。

关于c++ - 处理失败的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19934338/

相关文章:

java - 如何让 @ExceptionHandlers 在默认为任何运行时错误的异常处理程序之前处理特定异常?

java - 如何添加整数构造函数和公共(public)签名java

C++ - STD 正则表达式在长多行匹配期间在 MSVC 中崩溃

c++ - 在 c++builder 中编译 c++ 的问题

exception - 如何覆盖 Visual Studio Code Coverage 中的异常

JAVA - 线程中的异常 "main"java.lang.ArrayIndexOutOfBoundsException : 0

使用构造函数和 "this"对代码输出的 Java 解释

c# - 如何使 C# 构造函数语法更像 pythonic?

c++ - 如何在 C++20 中获得一个运行良好的生成器类模板?

C++ - 使用 vcpkg 加速安装