这段cpp代码如何转储?

时间:2012-10-30 14:33:11

标签: c++ exception runtime-error

我的意思是获得stack unwinding的一些知识并遇到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

有人能给我一些提示吗?

2 个答案:

答案 0 :(得分:2)

答案是你在抛出异常时抛出异常。

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

除此之外:这是导致一般最佳实践规则的原因,除非你的意思是杀死你的程序,否则你不能在析构函数中抛出异常。

答案 1 :(得分:0)

set_terminate()期望该功能提供给 terminate 该程序。

  

不带参数且返回void的函数。功能必须   不返回终止该计划。 terminate_handler是一个   函数指针类型不带参数并返回void。

如果你没有退出提供的函数,

set_terminate会在调用你的终止函数后自动调用abort()。 只需在exit(0);中添加my_terminate()即可避免看到此中止()消息。