gpt4 book ai didi

c++ - 为什么代码会崩溃?

转载 作者:太空宇宙 更新时间:2023-11-04 14:34:19 25 4
gpt4 key购买 nike

在互联网上寻找 C++ 脑筋急转弯,我找到了这个例子:

#include <iostream>

using namespace std;

class A {
public:
A()
{
cout << "A::A()" << endl;
}

~A()
{
cout << "A::~A()" << endl;
throw "A::exception";
}
};

class B {
public:
B()
{
cout << "B::B()" << endl;
throw "B::exception"; // <- crashes here
}

~B()
{
cout << "B::~B()";
}
};

int main(int, char**) {
try
{
cout << "Entering try...catch block" << endl;

A objectA;
B objectB;

cout << "Exiting try...catch block" << endl;
}
catch (const char* ex)
{
cout << ex << endl;
}

return 0;
}

这就是我认为程序会做的:

  1. A::A() 将在调用 objectA 的构造函数时输出到屏幕。对象A构建成功。
  2. 当objectB的构造函数被调用时,B::B()将输出到屏幕。
  3. 然后 B 的构造函数抛出一个异常。对象B没有构造成功。
  4. objectB 的析构函数未被调用,因为构造函数从未成功完成。
  5. 当退出 try block 时对象超出范围时,将调用 objectA 的析构函数。

然而,当我运行程序时,它实际上在标有<- 的行崩溃了。谁能解释一下当时到底发生了什么?

最佳答案

如果您真的在编码,而不仅仅是脑筋急转弯永远不要从析构函数中抛出异常。如果在堆栈展开期间抛出异常,则调用 terminate()。在您的情况下,A 的析构函数在处理 B 的构造函数中抛出的异常时抛出。

编辑:更准确地说(如评论中所建议的)——永远不要让异常逃脱析构函数。在析构函数中捕获的异常没有问题。但是,如果在堆栈展开过程中程序必须处理两个异常 - 一个导致堆栈展开,另一个在展开过程中逃脱了析构函数,std::terminate() 就可以了。

关于c++ - 为什么代码会崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1333522/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com