Pergunta

A pilha obter desenrolado (destruidores executar) quando um SIGABRT ocorre em C ++?

Graças.

Foi útil?

Solução

Esta resposta indica que destruidores não são chamados .

Outras dicas

Não:

$ 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

Não, únicas exceções provocam pilha relaxar. Os sinais são parte de POSIX, que é uma API C, por isso não é "consciente de" instalações C ++ como exceções.

A página man signal(3) na minha caixa de Mac OS X diz

  No    Name         Default Action       Description
...
 6     SIGABRT      create core image    abort program (formerly SIGIOT)

que me sugere que o padrão é não relaxar ...

o SIGABRT sinal é usado para fazer arquivo core de execução da aplicação de algum tempo. Nós algum tempo usar este sinal para aplicação de depuração. E, tanto quanto eu sei Destructors não são chamados por este sinal.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top