Показать полную графическую версию : Как корректно завершить программу
Как корректно завершить программу из глубоко вложенной функции.
exit(); - Вызывает деструкторы только для глобальных объектов.
Деструкторы для локальных(автоматических) объектов не вызываются!
Вызывать все деструторы вручную (как рекомендует MSDN) очень гиморно,
А вернее просто невозможно. (функция глубоко вложенная)
hasherfrog
27-01-2004, 09:36
ИМХО, не стоит пользоваться exit() в C++ . Это, извините, признак плохого тона. Все функции (процедуры), вплоть до той самой, которая требует немедленного выхода из программы, должны проверять состояние (возвращаемое значение) вызываемых фонкций и, в свою очередь, сообщать (немедленным возвратом с кодом ошибки) об этом тем, кто вызвал их самих. При этом деструкторы классов сработают тут же , а о "локальных объектоах" надо позаботиться.
Но это мое личное мнение. Если так ломает проверять состояние всех функций, просто делай exit() и не заморачивайся. Память, выделенная приложению, будет очищена и возвращена операционной системе. Так что не играет никакой роли, сработали деструкторы, не сработали... Пользователь все равно увидит сообщение об ошибке, а твое оно или системное, его уже волновать не будет.
Конечно, не все так просто:
1. В ОС, не поддерживающих разделение памяти между процессами (DOS), память будет "утекать".
2. Файлы, открытые объектом, желательно закрывать, иначе могут возникнуть файлы, которые "система не может удалить" (Win95).
3. Динамическая библиотека, в пределах которой сделан выход, уронит все приложение (*nix).
Поэтому, ИМХО, стоит подумать еще раз, а так ли уж и "невозможно" вернуться и вызвать деструкторы?
bilytur
Может проще кинуть исключение, которое будет ловиться только main'ом? Раскрутиться стэк и всё будет хорошо. Это при условии, что нет выражений типаtry
{
//...
}
catch (...)
{
//и здесь нету дальнейшего throw;
}Но программма, в которое встречается подобное - заведомо плохая программа.
Но программма, в которое встречается подобное - заведомо плохая программа.
Хочу писать хорошие программы :)
И элегантные.
Возможно это придет со временем.
Всем спасибо.
Если исключения в C++ используются только в исключительных ситуациях (например 1/1 000 000) и помогают написать понятную программу, то это признак мастерства. Например:
class MyApp {
public:
class MyExit {};
void do_something() throw MyExit
{
...
if (too_bad_to_proceed_) throw MyExit();
...
}
}
В main можно даже не ловить это исключение. Правильные компиляторы делают так, что оно не приводит к обрушению системы (в rtlInit... стоит try...catch) Кстати, такое решение называется красивым в книге Страуструпа.
hasherfrog
02-04-2004, 13:01
pva
то это признак мастерства
Некоторые среды программирования, например QT, вообще не предусматривают try/catch/trow. Их использование в ряде случаев приводит к Segmentation faults'ам при выходе. Объяснять как и почему, не буду, это только для использующих QT, но сам факт имеет место быть.
hasherfrog
Ты полностью прав! И в первом и во втором посте!
Исправлено: Prisoner, 7:49 3-04-2004
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.