Технически, _Exit
не определяется стандартом C ++, поэтому вы даже не можете вызвать его из 100% переносимой программы C ++. Стандарт C ++ 03 включает в себя в качестве ссылки стандарт C89 (он же C90 или ANSI C), тогда как _Exit
определяется только в более новом стандарте C99. Я не уверен, какую версию C включает в себя предстоящий стандарт C ++ 0x, но я предполагаю, что он основан на C99.
В любом случае, вот соответствующие пункты из соответствующих стандартов языка:
_Exit
не гарантируется закрытие файловых дескрипторов. От C99 §7.20.4.4 / 2 (выделено мое):
Функция _Exit
вызывает нормальное завершение программы и возвращает управление в среду хоста. Никакие функции, зарегистрированные функцией atexit
, или обработчики сигналов, зарегистрированные функцией signal
, не вызываются. Статус, возвращаемый в среду хоста, определяется так же, как и для функции exit
(7.20.4.3). Сбрасываются ли открытые потоки с неписанными буферизованными данными, закрытые потоки или удаляются временные файлы, определяется реализацией.
Напомним, что определяется реализацией означает, что реализация (т. Е. Инструментарий компилятора и среда выполнения) может делать все, что захочет, но должна документировать, что делает .
Из C ++ 03 §3.6.3 / 1:
Деструкторы (12.4) для инициализированных объектов статической длительности хранения (объявленных в области блока или в области пространства имен) вызываются в результате возврата из main и в результате вызова exit
(18.3). Эти объекты уничтожаются в обратном порядке завершения их конструктора или завершения их динамической инициализации. Если объект инициализируется статически, объект уничтожается в том же порядке, как если бы объект был динамически инициализирован. Для объекта массива или типа класса все подобъекты этого объекта уничтожаются до уничтожения любого локального объекта со статической продолжительностью хранения, инициализированной во время построения подобъектов.
§3.6.3 / 4
Вызов функции
void abort();
, объявленный в <cstdlib>
, завершает программу без выполнения деструкторов для объектов с длительностью автоматического или статического хранения и без вызова функций, переданных в atexit()
.
Практически, в большинстве реализаций деструкторы глобальных объектов реализуются через atexit
, так что вы увидите, что _Exit
не будет вызывать деструкторы для глобальных объектов, хотя такое поведение не гарантируется (поскольку _Exit
и C ++ не гарантированно существуют на одном языке).