C ++でSIGABRTが発生すると、スタックは巻き戻されますか(デストラクタが実行されます)?
ありがとう。
いいえ:
$ cat test.cc
#include <iostream>
#include <sys/types.h>
#include <signal.h>
class Test {
public:
~Test() { std::cout << "~Test called" << std::endl; }
};
int main(int argc, char *argv[])
{
Test t = Test();
if (argc > 1) {
kill(0, SIGABRT);
}
return 0;
}
$ g++ test.cc
$ ./a.out
~Test called
$ ./a.out 1
Aborted
この回答は、デストラクタが呼び出されていないことを示しています。
いいえ、例外のみがスタックの巻き戻しをトリガーします。シグナルはCAPIであるPOSIXの一部であるため、例外などのC++機能を「認識」していません。
signal(3)
私のMacOSXボックスのマニュアルページには
No Name Default Action Description
...
6 SIGABRT create core image abort program (formerly SIGIOT)
これは、デフォルトでは巻き戻さないことを私に示唆しています...
シグナルSIGABRTは、実行中のアプリケーションのコアファイルを作成するために使用されます。この信号を使用して、アプリケーションをデバッグする場合があります。そして、私が知る限り、デストラクタはこの信号によって呼び出されません。