Как написать обработчик сигнала для сигнала sigabrt? - PullRequest
1 голос
/ 01 января 2012

Я пытаюсь удалить уже удаленный объект и получаю сигнал SIGABRT. Я знаю, что этот сигнал прерывает мою программу, но я хочу перехватить этот сигнал в обработчике сигнала и отобразить сообщение об удалении уже удаленного объекта ...

Вот код, который я пробовал, но, похоже, он не работает. Пожалуйста, помогите мне понять, что в этом плохого?

using namespace std;

class myclass
{
public:
   myclass()  { cout <<"myclass constructed\n"; }
   ~myclass() { cout <<"myclass destroyed\n"; }
};

void func(int);

int main (void)
{
  signal(SIGABRT,func);
  myclass * pt;

  pt = new myclass[3];

  delete[] pt;
  delete[] pt;

  return 0;
}

void func(int)
{ 
   signal(SIGABRT,func);
   cout << "trying to delete unallocated memory, exiting....\n";
   exit(0);
}

1 Ответ

2 голосов
/ 01 февраля 2012

Стандарт C гласит (раздел 7.14, параграф 4 обоих C99 и C11 ):

Реализация не должна генерировать ни один из этих сигналов, кроме как в результате явных обращений к функции возрастания.

Стандарт C ++ не дает никаких дополнительных дополнительных гарантий.

POSIX говорит:

Функция abort () должна вызывать аварийное завершение процесса, если только сигнал SIGABRT не перехватывается и обработчик сигнала не возвращается.

Аварийныйобработка завершения должна включать в себя действия по умолчанию, определенные для SIGABRT, и может включать в себя попытку воздействия fclose () на все открытые потоки.

Сигнал SIGABRT должен быть отправлен вызывающему процессу, как если бы он был повышение () с аргументом SIGABRT.

Статус доступен для wait () или waitpid () с помощью abort ()должно быть процессом, завершенным SIGABRT сигнал.Функция abort () должна отменять блокировку или игнорирование сигнала SIGABRT.

Итак, у вас нет никаких оснований ожидать, что вы увидите SIGABRT вообще;вам повезло, что вы не сталкиваетесь с носовыми демонами !

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...