gpt4 book ai didi

c++ - 这段cpp代码是怎么转储的?

转载 作者:行者123 更新时间:2023-11-30 04:23:52 25 4
gpt4 key购买 nike

我想了解一些堆栈展开的知识,结果遇到了this page ,用下面的例子演示它。

#include <iostream>
using namespace std;

struct E {
const char* message;
E(const char* arg) : message(arg) { }
};

void my_terminate() {
cout << "Call to my_terminate" << endl;
};

struct A {
A() { cout << "In constructor of A" << endl; }
~A() {
cout << "In destructor of A" << endl;
throw E("Exception thrown in ~A()");
}
};

struct B {
B() { cout << "In constructor of B" << endl; }
~B() { cout << "In destructor of B" << endl; }
};

int main() {
set_terminate(my_terminate);

try {
cout << "In try block" << endl;
A a;
B b;
throw("Exception thrown in try block of main()");
}
catch (const char* e) {
cout << "Exception: " << e << endl;
}
catch (...) {
cout << "Some exception caught in main()" << endl;
}

cout << "Resume execution of main()" << endl;
}

然而,当我用g++/*clang++*编译时,它得到了核心转储。输出如下:

In try block
In constructor of A
In constructor of B
In destructor of B
In destructor of A
Call to my_terminate
已放弃 (核心已转储) #core dump

谁能给我一些提示?

最佳答案

答案是你在抛出异常的同时也在抛出异常。

main() 中,您构造了一个 A 实例。然后你抛出一个异常。 它被捕获之前,A::~A 被调用, 抛出一个异常。同时发生两个异常会导致调用 terminate()(或用户提供的等效项)(默认情况下调用 abort(),这会丢弃一个核心。无论哪种方式,程序无法恢复。)

旁白:这就是导致一般最佳实践规则的原因,即您不得在析构函数中抛出异常,除非您想让它终止您的程序。

关于c++ - 这段cpp代码是怎么转储的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13141233/

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