Раскручивается ли стек при возникновении SIGABRT?
-
18-09-2019 - |
Вопрос
Раскручивается ли стек (запускаются деструкторы), когда в 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
Нет, только исключения вызывают разматывание стека.Сигналы являются частью POSIX, который представляет собой C API, поэтому он не «осведомлен» о таких возможностях C++, как исключения.
А signal(3)
На странице руководства в моем ящике Mac OS X написано:
No Name Default Action Description
...
6 SIGABRT create core image abort program (formerly SIGIOT)
что подсказывает мне, что по умолчанию не расслабляться...
сигнал SIGABRT некоторое время используется для создания основного файла работающего приложения.Мы некоторое время используем этот сигнал для отладки приложения.И насколько я знаю, деструкторы не вызываются этим сигналом.
Не связан с StackOverflow