Отключение Крюк C ++ - PullRequest
       64

Отключение Крюк C ++

5 голосов
/ 07 августа 2011

есть ли способ запустить код при завершении, независимо от того, какой тип завершения (ненормальное, нормальное, необработанное исключение и т. Д.)? Я знаю, что на самом деле это возможно в Java, но возможно ли это даже в C ++? Я предполагаю среду Windows.

Ответы [ 4 ]

5 голосов
/ 07 августа 2011

Нет - если кто-нибудь вызовет TerminateProcess, ваш процесс будет уничтожен без дальнейших промедлений и (в частности) без каких-либо шансов запустить больше кода в процессе выключения.

2 голосов
/ 07 августа 2011

Для нормального закрытия я бы предложил

atexit()
1 голос
/ 07 августа 2011

Один хороший способ решения этой проблемы - это использование языка C ++ RAII, который здесь означает, что операции очистки могут быть помещены в деструктор объекта, т.е.

class ShutdownHook {
  ~ShutdownHook() { 
    // exit handler code 
  }
}; 

int main() { 
  ShutdownHook h; 
  //...
} 

См. Object Lifetime Manager в библиотеке ACE. В связанном документе они также обсуждают функцию atexit.

0 голосов
/ 08 августа 2011

Не для любого вида прекращения;есть сигналы, которые не обрабатываются, например, KILL в Linux.

Эти сигналы предназначены для завершения программы, которая использовала всю память, или ЦП, или некоторые другие ресурсы и оставила компьютер всостояние, которое затрудняет запуск функции-обработчика.

...