1

私はこのページについてある程度の知識を得るつもりであり、このページstack unwindingに出くわしました。これは、以下の例でそれを示しています。

#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

誰かが私にいくつかのヒントを与えることができますか?

4

2 に答える 2

2

答えは、例外をスローしているときに例外をスローしているということです。

ではmain()、Aインスタンスを作成します。次に、例外をスローします。 キャッチされる前A::~Aに、が呼び出され、これ例外をスローします。同時に2つの例外が発生すると、terminate()(またはユーザーが指定した同等の)が呼び出されます(デフォルトでは、abort()が呼び出され、コアがドロップされます。いずれにしても、プログラムは回復できません)。

余談ですが、これは、プログラムを強制終了するつもりでない限り、デストラクタで例外をスローしてはならないという一般的なベストプラクティスルールにつながるものです。

于 2012-10-30T14:48:11.117 に答える
0

set_terminate()関数がプログラムを終了することを提供することを期待します。

パラメータを受け取らず、voidを返す関数。関数は復帰せず、プログラムを終了します。terminal_handlerは、パラメーターを受け取らず、voidを返す関数ポインター型です。

set_terminateは、提供された関数を終了しない場合、終了関数を呼び出した後に自動的にabort()を呼び出します。このabort()メッセージが表示されないようにするには、単に追加exit(0);してください。my_terminate()

于 2012-10-30T14:38:34.737 に答える