Выключит () или исключение, чтобы исключить вызов деструктора конца области?

Предположим, у меня есть следующий код:

struct mytype { ~mytype() { /* do something like call Mix_CloseAudio etc */ } }; int main() { mytype instant; init_stuff(); start(); return 0; } 

Является ли этот деструктор гарантированно вызываться, даже если exit () используется где-то внутри start ()?

Если вы вызываете exit , деструктор не будет вызван.

Из стандарта C ++ (§3.6.1 / 4):

Вызов функции

 void exit(int); 

объявленный в (18.3), завершает программу, не покидая текущий блок и, следовательно, не уничтожая никаких объектов с автоматическим хранения (12.4). Если вызывается exit для завершения программы во время уничтожения объекта со статической продолжительностью хранения, программа имеет неопределенное поведение.

Да, вызов exit () означает, что деструктор не будет вызван:

Вызов функции void exit (int); объявленный в (18.3), завершает программу, не покидая текущий блок и, следовательно, не уничтожая никаких объектов с автоматическим хранения (12.4). Если вызывается exit для завершения программы во время уничтожения объекта со статической продолжительностью хранения, программа имеет неопределенное поведение.

Если сбрасывается исключение, с другой стороны, будет вызван деструктор. Это основа безопасности исключений на C ++.

Исключения будут вызывать деструкторы, если что-то в программе ловит исключение. Если исключение выходит из функции main (), не будучи пойманным, стандарт не требует, чтобы среда выполнения удаляла стек для очистки.

Используя

 try{ // code }catch(...){ //that elipsis should actually appear in your code //it doesn't mean I omitted code here. //code } 

в вашей main() функции main() будет гарантировано, что все исключения будут пойманы, и вызывается все деструкторы.

Interesting Posts

Возврат первой строки группы

Неизвестная escape-последовательность для строки пути, содержащей обратную косую черту

Автоматическая блокировка экрана для любого пользователя после определенного периода бездействия в Windows 7

Можно ли использовать Meteor с PhoneGap?

const с указателями в C

Lm-датчики сообщают о неправильной температуре на Intel Atom N270

Почему длина возвращает 1 для кортежа с 2 элементами и дает ошибку для кортежа с большим количеством элементов?

Как вызвать хранимые процедуры с помощью EntityFramework?

В чем разница между веб-сайтом и веб-приложением?

Подсчитывать и выделять ключевые слова в фразах

__ атрибут __ ((const)) vs __attribute __ ((чистый)) в GNU C

Получение страницы facebook с помощью app_scoped_user_id больше не возможно?

Инструмент командной строки для сброса версии Windows DLL?

Установка Windows на ноутбук с помощью внешнего монитора (основной дисплей сломан)

Выключение мягкой клавиатуры

Давайте будем гением компьютера.